bashスクリプトでさまざまなことをテストしていますが、説明が得られないという問題が発生しました。
私は意図的に間違ったコマンドを記述して、0とは異なる終了コードを取得しましたが、どういうわけか、まだ0を取得しているようです。
実行しているコードは次のとおりです:
USER_NAME=$(id -uns) if [[ ${?} -ne 0 ]] then echo "Your command failed to execute with exit code ${?}" exit 1 fi echo "Your username is ${USER_NAME}"
コードの出力は次のとおりです:
id:不明なオプション-s
試してください詳細については、「id–help」を参照してください。
終了コード0でコマンドを実行できませんでした
ユーザー名は
何らかの形で、echoコマンドの終了コードが表示されていると思いますか?それでも、終了コードが0の場合、なぜifステートメントに入力されるのですか?
それが問題である場合、表示する必要のある実際の終了コードを表示するにはどうすればよいですか?
回答
コード内のif
ステートメント内で、を取得する終了ステータス印刷されたは、テスト[[ ${?} -ne 0 ]]
の終了ステータスです。値$?
は常に最後に実行されたコマンドの終了ステータスであり、少なくともを結果に追加します。
id
の終了ステータスを出力する場合は、値が変更されない変数に割り当てます。
id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi
[[
はksh
構文の一部であり、インタープリターの一部として実行されますが、組み込みとしては実行されません。コマンド。ただし、インタプリタのこの部分は、記憶されている終了コードをリセットするようです。echo
を実行するのはなぜですか?私はそれを期待していました。exit 1
ステートメントが含まれていないコードのバージョン。おそらく後で追加されました。