set -kbashでオプションを使用するのはいつですか?
コマンド名の前の引数だけでなく、割り当てステートメントの形式のすべての引数がコマンドの環境に配置されます。
このオプションが何をするのかは理解していますが、いつ必要になるか想像できませんでした。
set -kbashでオプションを使用するのはいつですか?
コマンド名の前の引数だけでなく、割り当てステートメントの形式のすべての引数がコマンドの環境に配置されます。
このオプションが何をするのかは理解していますが、いつ必要になるか想像できませんでした。
回答:
基本的に、シェルスクリプトに渡された環境変数を(引数として)を介して環境内に設定されたように「注入」したいときにいつでも使用でき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では、コマンドに先行するキーワードパラメーター割り当て文字列はシェル変数に保存されません。それらは、現在のコマンドを実行するために分岐された直接のサブプロセスにのみ影響します。キーワードパラメータの割り当て文字列だけが(ローカル)シェル変数に保存されます。キーワードパラメータ割り当て文字列は、エイリアス、宣言、タイプセット、エクスポート、読み取り専用、およびローカルの組み込みコマンドの引数として表示される場合もあります。[Bashリファレンスマニュアルのセクション3.4]
キーワードパラメータ割り当て文字列は、コマンド名の後に配置されている場合、実行されるコマンドの引数として扱われます。
- キーワードパラメータは、setコマンドで操作できます。
set -o keywordはの長い形式ですset -k。をご覧くださいhelp set | grep -- '-k'。
./cmd.bash VARCMD=hiを使用set -kしない場合とまったく同じ方法でVARCMD=hi ./cmd.bash動作させる必要がありset -kます。OPの特定の質問は、./cmd.bash VARCMD=hiフォームをサポートするためにbashの必要性に関するものだと推測します
の実用的な使用法 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.
-kにより、リファクタリングせずに30年前のシェルスクリプトを実行できます。:代わりに接頭辞構文を使用して、一時的な環境変数を渡しvar1=x var2=y command ...