存在する私の答えはここにあります、次の構造を使用しました。
n=$1 shift
読むトークン認識仕様、私はシェルが行を変数割り当てと組み込みn=$1
コマンドの2つの部分に解析することを知っていますshift
。
しかし、私の答えに対するコメント一部のシェルでは状態n=$1 shift
が失敗します。
私は迅速な確認をしました:
$ for shell in /bin/*[^c]sh; do
printf '=%-17s=\n' "$shell"
"$shell" -c 'a=$1 shift; echo "$a"' "$shell" 1
done
=/bin/ash =
1
=/bin/bash =
=/bin/dash =
1
=/bin/heirloom-sh =
1
=/bin/ksh =
1
=/bin/lksh =
1
=/bin/mksh =
1
=/bin/pdksh =
1
=/bin/posh =
1
=/bin/schily-osh =
1
=/bin/schily-sh =
1
=/bin/yash =
1
=/bin/zsh =
bash
を除くすべてのシェルがzsh
機能します。ただし、モードとシミュレーションbash
では機能します。posix
zsh
sh
$ ARGV0=sh bash -c 'a=$1 shift; echo "$a"' sh 1
1
$ ARGV0=sh zsh -c 'a=$1 shift; echo "$a"' sh 1
1
var=value; shift
すべてのシェルで利用可能です。
もしそうなら、これらの構造はPOSIX互換シェルで同じですか?
ベストアンサー1
Bourne Shellでは、組み込みコマンドより前のすべての型の変数の割り当ては、シェル全体に影響します。
David Kornは、履歴編集が追加される前に多くの組み込み機能を備えた強化されたBourne Shellを作成し始めたので、この動作は彼にとって明らかに問題でした。
その結果、ksh88は異なる動作をし、この動作は最新のPOSIX標準を支配しました。
現在のルールは次のとおりです。
VAR=value
a がspecial builtin
シェル全体に影響を与える前にVAR=value
これが組み込みコマンドであっても、他のコマンドはこのコマンドにのみ影響します。
あなたの間違いはspecial builtin
。
特別な組み込み関数のリストを取得するには、たとえばを呼び出すことができbuiltin -s
ますSchily Bourne Shell
。
他の組み込み関数(コマンドを使用)を使用してテストすると、cd
既存のBourne Shellでテストを実行したときにのみ変数の割り当てがコマンドに保存されるため、他の結果が表示されます。cd
ただし、POSIXは環境を維持するためにシェルを許可しますが、必要はありませんspecial builtins
。すべての組み込み関数(特殊な組み込み関数を含む)に対して同じ動作が必要な場合は、組み込み関数名の前に付けることができますcommand
。