誰かが存在しないコマンドを呼び出すとしましょう。後で実行するスクリプトでそのエラー状態を取得する唯一の方法は、次の方法を使用することです。source
つまり、スクリプトの名前がdummy
そのコンテンツの場所にあると仮定します。
#!/bin/bash
echo $?
呼び出すと、私が探している(127)終了ステータスのみを取得できることがわかりますが、これを使用せずにスクリプト内の最後のコマンドから終了ステータスを取得するのにsource dummy
役立つ可能性がある他の方法はありますか?私が望む動作を得るために単に電話をかけることはできますか?alias
source
dummy
前のコマンドのタイプミスを確認するスクリプトを作成したいと思います。これを行うには、最初に潜在的なミスがあるかどうかを確認するために前の終了ステータスを検出する必要があるため、スクリプトは最後のコマンドの終了ステータスを取得できる必要があります。また、ユーザーが実行する必要がある設定の量を最小限に抑えて、ユーザーが電話をかけただけで、残りの部分をdummy
知って処理するようにしたいと思います。だから私はsource
「または」.
や「または」を避けようとしますalias
。
最後のコマンドの終了状態の初期テストは、以下を使用することでした。
#!/bin/bash
ESTATUS=$? # Saved exit status for later
echo $ESTATUS
しかし、これを行うには、またはをsource
使用せずに複製するための良い方法はありますか?source
.
答え1
このスクリプトを使用することもできますhttps://github.com/rcaloras/bash-preexec(議論https://superuser.com/questions/175799/does-bash-have-a-hook-that-is-run-before-executing-a-command)precmd()関数を使用して$?
答え2
これが何につながるのかよくわかりませんが、次のようにできます。
alias dummy='sh dummy $?'
the_program_with_errors
dummy
スクリプトdummy
には以下が含まれます。
echo $1
別の方法はalias
シェル関数を使用することです。
function dummy { sh dummy $? ;}
この定義を使用すると、次の動作を取得できます(およびサブシェルプロセスを使用してエミュレートされますtrue
)false
。
$ true
$ dummy
0
$ false
$ dummy
1
$ (exit 42)
$ dummy
42
答え3
あなたが呼び出すスクリプトは、あなたが望む応答を提供する必要があるようです。コマンドをテストし、これらのスクリプトで特定の終了コードを使用する方法は次のとおりです。
#!/bin/bash
# Test for the existence of a command in the path.
command=typo_command
if [[ ! $(command -v $command) ]]; then
echo "$command does not exist"
exit 127 # or the code you choose
fi
答え4
関数を書く
シェルはプロセスで、値は$?
。あなたのスクリプトは別のサブプロセスですそれ自体の価値がある$?
。
$?
自分に属するシェルを確認するには、シェルプロセスでコマンドを実行する必要があります。source
1つの方法ですが、より簡単な方法は関数を書くことです。
function dummy(){
echo $?
}
ユーザーまたは同等の項目として宣言されている場合は、期待どおりに使用可能で.bashrc
動作する必要があります。
(必要に応じて値を渡すことで、他の目的を実行するためにスクリプトを呼び出すこともできます$?
。)