web-dev-qa-db-ja.com

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

#!/bin/bash
function0()
{
 local t1=$(exit 1)
 echo $t1
}

function0

echoは空の値を出力します。私は期待しました:

1

なぜt1変数には、exitコマンドの戻り値が割り当てられます-1

46
user93868

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

  • サブシェルで_exit 1_を実行します。
  • 関数のローカル変数_t1_にその出力(標準出力に出力するテキストなど)を格納します。

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

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

終了コードは常に_$?_に割り当てられるので、

_function0()
{
  (exit 1)
  echo "$?"
}
_

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

_function0()
{
  (exit 1)
  local t1=$?
  echo "$t1"
}
_
62
Stephen Kitt

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

#!/bin/bash

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

func
12
cuonglm

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よりも優れた動作であると私は主張します。インタープリターが再帰的にループ評価する値を本当に使いたいですか?

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

7
mikeserv