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


22

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ディストリビューションにはmanページがありませんset


1
「このビルトインは非常に複雑なので、独自のセクションに値します。」参照ドキュメント
galath

回答:


17

set は、環境変数だけでなく、シェル関数もすべて表示するシェルビルトインです。これはリストの最後に表示されています。

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

bash マニュアルページから:

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

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


3
これkshは、シェル変数に関数定義を保存しないためです。
クオンルム

2
@cuonglm dgkによる賢明な設計決定!;-)
jlliagre

7

set出力があり、which set何も返さないため、使用しているシェルの一部であり、bashである可能性があります。

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

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

setの呼び出し仕様は次のとおりです。

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

コマンドラインでmanで検索したい場合は、

/set.*abef

which setシェルに依存します。少なくともzshあなたのためにそれを報告します。詳細についてはこちらもご覧ください。
cuonglm

bashには大きな市場優位性があるため、bash以外のものに関する質問ではないようです。デフォルト以外のシェルを使用している場合は、この質問をする必要はありません。
user1133275

6

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

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

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


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

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

var=-fxd; set "$var"

fで表示xされますが$-

var=fdx; set "$var"

にのみf存在し$-ます。どちらの場合も、fそしてx中に提示する$-zshshおよびkshエミュレーション。

そのような状況からあなたを守るために---またはで始まる場合でも位置パラメータを設定するための最初の引数として渡すことができます+

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

コンテンツに関係なく、に割り当て$varられ$1ます。

set -- これ以上引数を指定しないと、すべての定位置パラメーターが設定解除されます。

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

set -xv - -f

割り当てられます-f$1set -また、位置パラメータの設定を解除しませんでした。Schily oshもそのように動作します。家宝はSHの設定を解除しませんvし、xオプションを。

唯一のPOSIXシェルの例外はyash-最初の定位置パラメーターとして扱われるです。

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

シリー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

私は人々がどこかが、最初の1にリンクする理由...あなたが間に別のを言及したいかもしれません理解したことがないset -- $unsetset - $unsetset $unset、及びset "$unset"そのために-それは、通常、最初の場所でのトラブルのようなものに人々を得るそれらの不一致です。
mikeserv

@mikeserv:さて、詳細を追加しましたが、使用したときの意味がわかりませんでした$unset
cuonglm

@cuonglmコマンドset $unsetset、設定されていない変数とまったく同じように動作します。しかしset "$unset"unset実際に設定されていない変数である場合、注意します。set - $unset削除-vして-x(bashで)セットオプションを。

@BinaryZebra:ああ、もちろん、私にとってはを使用しunset_varたほうが良いでしょう。また、set "$unset"実際$1には空に設定されていることに注意してください。これはシェルの拡張に関するものであり、厳密setにはでありませんので、言及しません。
クオンルム

1
@mikeserv:との動作はposh、表示さyashれるときに異なり-ます。あなたは私の更新版を読むことができます(そして、それを自由に改善してください)。
クオングルム

2

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

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

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

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


のだろうかset -x; set参考になる
ILMostro_7
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.