#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
は空の値を出力します。私は期待しました:
1
なぜt1
変数には、exitコマンドの戻り値が割り当てられます-1
?
local t1=$(exit 1)
は、シェルに次のことを指示します。
exit 1
_を実行します。t1
_にその出力(標準出力に出力するテキストなど)を格納します。したがって、_t1
_が空になるのは正常です。
($()
は コマンド置換 として知られています。)
終了コードは常に_$?
_に割り当てられるので、
_function0()
{
(exit 1)
echo "$?"
}
_
あなたが探している効果を得るために。もちろん、_$?
_を別の変数に割り当てることができます。
_function0()
{
(exit 1)
local t1=$?
echo "$t1"
}
_
終了コードは $? 変数に格納されました。 Command Substitution を使用すると、出力のみがキャプチャされます。サブシェルを作成するには、 (...)を使用する必要があります :
#!/bin/bash
func() {
(exit 1)
local t1=$?
printf '%d\n' "$t1"
}
func
bash
ではこれが機能します:
loc(){ local "x=$(exit "$1"):$?"
printf '$%s:\t%d\n' \
x "${x##*:}" \? "$?"
}
コマンドの評価と変数の割り当ての順序に関係しています。 local
には独自の戻り値があり、これは現在実行中のコマンドであり、コマンド置換ではありません。理由は...
x=$(exit 1); echo "$?"
... 1を返すことができるのは、$x
の値を割り当てるために実行されるサブシェルを除いて、そのコマンドに戻りがないためです。つまり、$?
は、コマンド置換が使用される他のすべての場合のように破壊されません。
とにかく、local
を使用するとdoesが失敗します-しかし、適切なタイミングで検出された場合-これは、展開がまだ評価されており、beforelocal
のルーチンはそれを上書きする可能性があります-割り当てることができます。
unset x; loc 130; echo "${x-\$x is unset}"
...プリント...
$x: 130
$?: 0
$x is unset
ただし、多くのシェルでは、$?
が評価の途中で設定されていることに依存することはできないことを知っておく必要があります。実際には、おそらくbash
がそうであるように、それらのシェルがすべての可能性のある時点で再評価を行う必要がないためです-これはおそらくbash
よりも優れた動作であると私は主張します。インタープリターが再帰的にループ評価する値を本当に使いたいですか?
とにかく、それはあなたがそれを行うことができる方法です。