シェルローカル変数への終了コードの割り当て


回答:


58

local t1=$(exit 1) シェルに次のことを指示します。

  • exit 1サブシェルで実行します。
  • 出力(標準出力に出力するテキストなど)をt1関数のローカル変数variable に保存します。

したがってt1、空になるのは正常です。

コマンド置換$()として知られています。)

終了コードは常にに割り当てられるため$?、次のことができます

function0()
{
  (exit 1)
  echo "$?"
}

探している効果を得るために。もちろん、$?別の変数に割り当てることができます:

function0()
{
  (exit 1)
  local t1=$?
  echo "$t1"
}

1
パイプにリターンを入れることもできます。`$(トラップ「のprintf『:: ERRNO:$?』」0;#は今しかし、何でも-最後に書き込まれた文字列を確保することをトラップが全体の置換コンテキストの最後のリターンです。
mikeserv

1
@mikeservバックティックを見逃しましたか?$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
ドクターJ

12

終了コードは$?変数。コマンド置換を使用すると出力のみがキャプチャされるため、(...)を使用してサブシェルを作成する必要があります。

#!/bin/bash

func() {
  (exit 1)
  local t1=$?
  printf '%d\n' "$t1"
}

func

割り当てのポイントはt1=$?それを使用することです。そして$?、割り当てopによって破壊されることはありませんか?私はそれはすべきではない場合、私は求めていると思いますprintf '%d\n' "${t1}"
Dani_l

@Dani_l:ありがとう、それはミスタイプミスです。更新しました。
クオンルム

別の方法でリダイレクトしない限り、コマンド置換は標準出力のみをキャプチャすることに注意してください。
フィアット

7

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ます。インタープリターを使用して、値を使用する前に上書きされる可能性が非常に高い値を再帰的にループ評価しますか?

とにかく、それはあなたがそれを行うことができる方法です。


-1

単に終了コードを取得しようとする理由に応じて、実行することもできif some-command; then echo "Success $?"; else echo "Failure $?"; fiますが、コマンドの出力では何もせず、コマンド実行の終了コードを評価するだけです。追加できますoror$(around the command and you'll still get the same results. A better example might beif 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') )


コマンド置換は終了コードを与えないという事実のために、主張された出力はすべて間違っています。これが問題の全体的なポイントです。「ダーティトリック」が何と関係があるのか​​は明確ではありません。
ニックマッテオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.