`var=valuebuiltin`は`var=value;と同じですか?組み込み `?

`var=valuebuiltin`は`var=value;と同じですか?組み込み `?

存在する私の答えはここにあります、次の構造を使用しました。

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では機能します。posixzshsh

$ 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=valuea がspecial builtinシェル全体に影響を与える前に

  • VAR=valueこれが組み込みコマンドであっても、他のコマンドはこのコマンドにのみ影響します。

あなたの間違いはspecial builtin

特別な組み込み関数のリストを取得するには、たとえばを呼び出すことができbuiltin -sますSchily Bourne Shell

他の組み込み関数(コマンドを使用)を使用してテストすると、cd既存のBourne Shellでテストを実行したときにのみ変数の割り当てがコマンドに保存されるため、他の結果が表示されます。cd

ただし、POSIXは環境を維持するためにシェルを許可しますが、必要はありませんspecial builtins。すべての組み込み関数(特殊な組み込み関数を含む)に対して同じ動作が必要な場合は、組み込み関数名の前に付けることができますcommand

おすすめ記事