#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
空の値を出力します。私は期待した:
1
なぜt1
変数にexitコマンドの戻り値が割り当てられ ないの1
ですか?
#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
空の値を出力します。私は期待した:
1
なぜt1
変数にexitコマンドの戻り値が割り当てられ ないの1
ですか?
回答:
local t1=$(exit 1)
シェルに次のことを指示します。
exit 1
サブシェルで実行します。t1
関数のローカル変数variable に保存します。したがってt1
、空になるのは正常です。
(コマンド置換$()
として知られています。)
終了コードは常にに割り当てられるため$?
、次のことができます
function0()
{
(exit 1)
echo "$?"
}
探している効果を得るために。もちろん、$?
別の変数に割り当てることができます:
function0()
{
(exit 1)
local t1=$?
echo "$t1"
}
$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
終了コードは$?変数。コマンド置換を使用すると出力のみがキャプチャされるため、(...)を使用してサブシェルを作成する必要があります。
#!/bin/bash
func() {
(exit 1)
local t1=$?
printf '%d\n' "$t1"
}
func
t1=$?
それを使用することです。そして$?
、割り当てopによって破壊されることはありませんか?私はそれはすべきではない場合、私は求めていると思いますprintf '%d\n' "${t1}"
でbash
、この作品:
loc(){ local "x=$(exit "$1"):$?"
printf '$%s:\t%d\n' \
x "${x##*:}" \? "$?"
}
コマンドの評価と変数の割り当ての順序に関係しています。local
戻り値はすべて独自のものであり、コマンド置換ではなく現在実行中のコマンドです。理由のようなもの...
x=$(exit 1); echo "$?"
... 1を返すことができるのは、サブシェルを実行して$x
値を割り当てることを除いて、そのコマンドに戻り$?
がないためです-したがって、コマンド置換が使用される他のすべての場合のように破壊されることはありません。
とにかく、local
それは壊されます-しかし、あなたがちょうど適切なタイミングでそれを捕まえた場合-それは拡張がまだ評価されており、前 local
のルーチンがそれを壊す機会がある前に-あなたはまだそれを割り当てることができます。
unset x; loc 130; echo "${x-\$x is unset}"
...プリント...
$x: 130
$?: 0
$x is unset
ただし、多くのシェルでは$?
、そのように評価の途中で設定することに頼ることができないことを知っておく必要があります。実際、それはおそらく、これらのシェルがおそらくすべての可能な接合点で再評価を気にしないからですbash
-私はそれがおそらくよりも良い動作だと主張しbash
ます。インタープリターを使用して、値を使用する前に上書きされる可能性が非常に高い値を再帰的にループ評価しますか?
とにかく、それはあなたがそれを行うことができる方法です。
単に終了コードを取得しようとする理由に応じて、実行することもできif some-command; then echo "Success $?"; else echo "Failure $?"; fi
ますが、コマンドの出力では何もせず、コマンド実行の終了コードを評価するだけです。追加できますor
(or
$(around the command and you'll still get the same results. A better example might be
if grep -q 'somestring' somefile; then echo "somestring exit code is $?";そうでなければ "somestring exit codeが見つかりませんでした$?"; fi`。
あなたはまた、明示的にいずれかになります関数の戻りコードをテストすることができreturn 3
、あなたが持っていないことに注意する必要があり、この場合、または最後のコマンドの結果である暗黙のリターンコードecho
の末尾にそれ以外の場合は、以前の終了コードをマスク/リセットします。
command_last () {
echo "True is `true`"
echo "False is `false`"
false
}
command_last; echo $?
# Outputs:
# True is 0
# False is 1
# 1
echo_last () {
echo "True is `true`"
echo "False is `false`"
false
# echo'ing literally anything (or nothing) returns true aka exit 0
echo
}
echo_last; echo $?
# Outputs:
# True is 0
# False is 1
# # Blank line due to empty echo
# 0
最後に、配列定義であるためできないVAR=(SOME_COMMAND)
ため、汚いトリックです。VAR=()
VAR=( $(echo 'Some value') )