web-dev-qa-db-ja.com

引数なしのsetコマンドは何をしますか?

引数なしのsetコマンドは何をしますか?

ご覧のように、envコマンドと同じように、環境変数をアルファベット順に出力します。さらに、次のようないくつかの異なる情報(変数?関数?)を出力します。

__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local quoted;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}

それは何で、どこから来たのですか?

setコマンドに関する情報が引数なしで見つかりません。実際、Linuxディストリビューションにはmansetページがありません。

22

setは、環境変数だけでなくすべてのシェル変数と、リストの最後に表示されているシェル関数も表示するシェル組み込みです。

変数は、行が実行またはソースされるときに変数を設定できる構文で表示されます。

bashから マニュアルページ

オプションまたは引数が指定されていない場合、setはすべてのシェル変数と関数の名前と値を、現在のロケールに従ってソートされ、設定またはリセットの入力として再利用できる形式で表示します現在設定されている変数

異なるシェルでは、動作は必ずしも同じではありません。たとえば、kshsetはシェル関数を表示しません。

17
jlliagre

setはシェルの組み込み で、シェルオプションと位置パラメータを設定および設定解除するために使用されます。

引数がない場合、setは、現在の locale でソートされたすべてのシェル変数(環境変数と現在のセッションの変数の両方)を出力します。

bashのドキュメント も読むことができます。


いくつかの注意点があります。

_set "$var"_はvar値を_$1_に割り当てます。 _$var_が_-_または_+_で始まる場合、_$var_の内容はシェルオプションのシーケンスとして扱われます。 _$var_に無効なオプションが含まれている場合、ほとんどのPOSIXシェルがエラーを出力します。 yashzshエミュレーションのshおよびkshは、エラーを出力するだけでなく、有効なオプションを設定します。 yashは最初の無効なオプションでオプションの設定を停止しますが、zshはすべてのオプションを割り当てます。 yash内:

_var=-fxd; set "$var"
_

fおよびxは_$-_に存在しますが、

_var=fdx; set "$var"
_

_$-_にはfのみが存在します。どちらの場合でも、fおよびxは__$-_に存在し、zshshおよびkshエミュレーションに存在します。

そのような状況からユーザーを保護するには、_--_または_-_で始まる場合でも、最初の引数として_+_を渡して位置パラメータを設定できます。

_var=-fdx; set -- "$var"
_

内容に関係なく_$var_を_$1_に割り当てます。

それ以上引数を指定しない_set --_は、すべての定位置パラメーターの設定を解除します。

最初の引数が_-_の場合、動作は指定されていません。すべての既知のPOSIXシェルは、xおよびvオプション(poshを除く)の設定を解除し、_-_の後のすべてを位置パラメータに割り当てます。

_set -xv - -f
_

_-f_を_$1_に割り当てます。 _set -_も定位置パラメーターの設定を解除しませんでした。 Schily osh もそのように動作します。 Heirloom shvおよびxオプションの設定を解除しません。

POSIXシェルの唯一の例外はyashで、これは_-_を最初の定位置パラメーターとして扱います。

_$ yash -c 'set -xv - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
+ printf %s\n - -f
-
-f
+ printf %s\n cvx
cvx
_

Schily sh _-_が引数に存在する場合、何もしません:

_$ schily-sh -c 'set -v - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
<blank line>
s

$ schily-sh -c 'set -v -- -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
-f
vs
_
8
cuonglm

setには出力とwhich setは、使用しているシェルの一部であることがわかっているものは何も返しません。おそらくbashです。

man bash は何度も言及していますが、 オンラインドキュメント でリンクする方が簡単です。

このビルトインは非常に複雑なので、独自のセクションに値します。 setを使用すると、シェルオプションの値を変更して位置パラメータを設定したり、シェル変数の名前と値を表示したりできます。

セットの呼び出し仕様は次のとおりです。

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

したがって、コマンドラインで人にそれを見つけたい場合は、

/set.*abef
8
user1133275

Bashシェル内で作業している場合は、help setと入力します。

印刷されたヘルプの最後に、次をお読みください:

ARGが指定されていない場合、すべてのシェル変数が出力されます。

したがって、引数なしsetは、シェルが認識しているすべての変数を出力します。

2
user79743