Bashの `set -k`オプションの実際の使い方

Bashの `set -k`オプションの実際の使い方

set -kBashではいつオプションを使用しますか?

バッシュリファレンスマニュアル説明する、

代入形式のすべての引数は、コマンド名の前の引数だけでなく、コマンド環境にも配置されます。

このオプションの機能を理解していますが、いつ必要なのかは想像できません。

ベストアンサー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コマンドで操作できます。

おすすめ記事