2013-05-21 11 views
12

をチェックし、私は別のスクリプトからファイルなどのname.shを調達し、リターンコードをチェックして、それのエラーコードを決定します。私は源別のスクリプトからシェルスクリプトとリターンコード

source name.sh 

を使用する場合は、name.sh場合は、実行するためにゼロ以外の戻りコードに私のメインスクリプトの停止を返すが、私は継続するか停止する終了コードの天候を決定する必要があります。

私は

ret_code="`source name.sh`" 
echo $ret_code 

を使用する場合は、ret_codeがnullで、エラー・コードが印刷されません。 は、私はこれらを使用することはできません。

sh name.sh 
./name.sh 
bash name.sh 

name.shが実行可能ではないと私はそれがリターンコードが変数$?にする必要があります

+0

"name.sh"の実行可能コードを関数に囲まないのはなぜですか? – michaelmeyer

+0

@doukremt私のスクリプトは、( '') – amin

+1

バッククォートは、その後、 'ソースname.sh'を実行下位のシェルを起動ディレクトリ内の他のスクリプトのシリアルを実行する必要があるため。これは 'bash name.sh'と同じです($ SHELLがbashであると仮定します)。 – msw

答えて

13

ファイルはsh name.shを実行するために実行可能である必要はありません:あなたは、次の操作を行うことができます。使用$?より。

sh name.sh 
ret_code=$? 
+0

私はあなたがAminの要件を誤解していると思います。彼はそれを実行していない、ファイルを調達しています。ソーシングの戻り値は、最後に実行されたコマンドの戻り値です。 –

6

実行できるようにしたくないので。

source name.sh   # Execute shell script 
ret_code=$?   # Capture return code 
echo $ret_code 
+0

name.shは 'source'を用いる – amin

+4

目的は、現在のシェル内でスクリプトを実行することで継続するコード停止1出口を含む場合、私は、ソースname.shを使用する場合。したがって、 'exit'は現在のシェルも停止します。元の質問には 'source'を使用する明示的な要件がありました。私はあなたがその結果を知っていると仮定しました。 – unxnut

+0

私はソースを使用すると何が起こるのか、どうしてあなたの助けに感謝したかを言いました – amin

0

Aminの場合、name.shの戻り値は最後に実行されたコマンドの戻り値です。いつものように$?を使ってアクセスしてください。

リターンコードをキャプチャする最も簡単な方法は、それがコマンドは(成功した後、エラーをマスクする可能性がある)は、複数のコマンドを実行していないされもたらす失敗に「name.sh」構造です。 bashを使用しているので、関数を使用することもできます。ロジックを関数に移動して呼び出すだけです。このようにして、name.shは1ライナーになり、$?の値は関数の戻り値になります。例えば

:あなたが関数にあなたのロジックを置く場合

# cat fred 
function f() {complicated; logic; here; export FRED="asdf";return 1;} 
f 
# source fred 
# echo $? 
1 
# echo $FRED 
asdf 

しかし、その後、あなたにもファイルをソースして、あなたのレジャーで関数を呼び出すことがあります。

# cat fred 
function f() {complicated; logic; here; export FRED="asdf";return 1;} 
# source fred 
# f && echo "that worked!" || echo "failed again" 
failed again 
# echo $FRED 
asdf 
関連する問題