set -k
Bashではいつオプションを使用しますか?
バッシュリファレンスマニュアル説明する、
代入形式のすべての引数は、コマンド名の前の引数だけでなく、コマンド環境にも配置されます。
このオプションの機能を理解していますが、いつ必要なのかは想像できません。
答え1
デフォルトでは、環境変数で設定されているように、シェルスクリプトに引数として渡された環境変数をいつでも「注入」できますが、コマンドの途中で実行する前にリストに永続的に常駐するexport
必要はありません。export
メモ:-k
スイッチの長い形もありますset -o keyword
。
はい
$ cat cmd1.bash
#!/bin/bash
echo $VARCMD
今私はset -k
:
$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi
しかし、上記のスクリプトを実行すると、次のようになります。
$ ./cmd1.bash
$
輸出は何をしますか?
$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands. If VALUE is supplied, assign VALUE before exporting.
...
export | grep VAR
したがって、スクリプトに次のように追加した場合:
$ cat cmd2.bash
#!/bin/bash
echo $VARCMD
export | grep VAR
上記のテストをやり直してください。
$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"
しかしset -k
:
$ ./cmd2.bash
$
set -k
一時的に変数を一括エクスポートする場合も同様です。
他の例
$ cat cmd3.bash
#!/bin/bash
echo $VARCMD1
echo $VARCMD2
export | grep VAR
複数の変数を設定すると、すべてエクスポートされます。
$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"
それでは、すべての環境変数を注入するのでしょうか?
いいえ、-k
ここでは非常に明確なことが行われています。コマンドを実行すると、コマンドラインに含まれる変数のみがエクスポートされます。
はい
この変数を設定したとしましょう。
$ VARCMD1="hi"
同じコマンドを実行するときは、以下を省略しますVARCMD1="hi"
。
$ set -k; ./cmd3.bash VARCMD2="bye"; set +k
bye
declare -x VARCMD2="bye"
しかし、なぜこれが起こるのですか?
この機能について少し説明した「キーワード引数割り当て文字列」というソースが見つかりました。メモ:ソース URL は IP アドレスを使用するため、SE から直接接続できません。
http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html
任意の言語でプログラムする場合、変数とその値を渡すことは信頼できるコードを書くために重要です。整数と配列変数の型を除いて、他のすべてのシェル変数は文字列を値として受け入れます。一貫性のために、シェルプログラミング言語について話すときに「キーワード引数」というフレーズを使用することを好みます。キーワード引数に値を割り当てるときに注意すべき点がいくつかあります。
意図しない効果を避けるために、必ずコマンド文字列の前にパラメータ割り当てサブ文字列を追加してください。
Bシェルでは、キーワード引数に割り当てられた値が(ローカル)シェル変数に格納されます。 Bash と ksh では、コマンドの前のキーワード引数代入文字列はシェル変数に格納されません。現在のコマンドを実行するために分岐した直系サブプロセスにのみ影響します。 1行のキーワード引数の割り当て文字列は、実際には(ローカル)シェル変数に格納されます。キーワード引数の割り当て文字列は、別名、宣言、組版、エクスポート、読み取り専用、およびローカル組み込みコマンドの引数としても表示できます。 [Bashリファレンスマニュアルセクション3.4]
キーワード引数 割り当て文字列がコマンド名の後に続く場合、実行するコマンドの引数として扱われます。
- キーワードパラメータはsetコマンドで操作できます。
答え2
実際の使用法はset -k
個人的なスタイルの問題である可能性が高いです。関数呼び出しでキーワード引数を使用するプログラミング言語を好む人や、dd
コマンド構文を好む少数の人など、一部の人は以下を好むかもしれません。
セット-k ... コマンドvar 1 = val 1 var 2 = val 2
到着
var 1 = val 1 var 2 = val 2コマンド
このオプションが一部のシェルに存在する実際の理由は、POSIX標準のsetコマンドの基本原則:
The following set flags were omitted intentionally with the following rationale:
The -k flag was originally added by the author of the Bourne shell to make it easier
for users of pre-release versions of the shell. In early versions of the Bourne shell
the construct
set name=value
had to be used to assign values to shell variables.