Classic Bourneシェルがサポートされ、BashおよびKornシェルは-kオプションを引き続きサポートします。有効になっている場合dd、コマンドライン上の任意の ' -like'コマンドオプションは、コマンドに渡される環境変数に自動的に変換されます。
$ set -k
$ echo a=1 b=2 c=3
$
それらが環境変数であると確信するのは少し難しいです。これを実行すると私のために働く:
$ set -k
$ env | grep '^[a-z]=' # No environment a, b, c
$ bash -c 'echo "Args: $*" >&2; env' a=1 b=2 c=3 | grep '^[a-z]='
Args:
a=1
b=2
c=3
$ set +k
$ bash -c 'echo "Args: $*" >&2; env' a=1 b=2 c=3 | grep '^[a-z]='
Args: b=2 c=3
$
最初のenv | grep例では、単一の小文字で環境変数が示されていません。最初の例bashは、を介して実行されるスクリプトに引数が渡されておらず-c、環境には3つの1文字の変数が含まれていることを示しています。はをset +kキャンセル-kし、同じコマンドに引数が渡されたことを示します。(a=1として扱われた$0スクリプトのました。適切なエコーを使用して、それを証明することもできます。)
これは、質問が求めるものを実現します—タイピング./script.sh a=1 b=2は、タイピングと同じでなければなりませんa=1 b=2 ./script.sh。
スクリプト内で次のようなトリックを試みると、問題が発生することに注意してください。
if [ -z "$already_invoked_with_minus_k" ]
then set -k; exec "$0" "$@" already_invoked_with_minus_k=1
fi
"$@"逐語的に処理されます。(との両方bashでksh)割り当てスタイルの変数を見つけるために再分析されません。私は試した:
#!/bin/bash
echo "BEFORE"
echo "Arguments:"
al "$@"
echo "Environment:"
env | grep -E '^([a-z]|already_invoked_with_minus_k)='
if [ -z "$already_invoked_with_minus_k" ]
then set -k; exec "$0" "$@" already_invoked_with_minus_k=1
fi
echo "AFTER"
echo "Arguments:"
al "$@"
echo "Environment:"
env | grep -E '^([a-z]|already_invoked_with_minus_k)='
unset already_invoked_with_minus_k
already_invoked_with_minus_k環境変数のみがexec'dスクリプトます。