Bashスクリプト内の新しいターミナルウィンドウで起動されたプログラムのエラーコードを取得しようとしています。次のように単純化できます。
#!/bin/bash
urxvt -e bash -c "exit 4"
echo $?
出力:0
urxvtを呼び出すスクリプトから「4」にアクセスしたいです。どうすればいいですか? :)
答え1
uxvrt
AFAIKグラフィックターミナルには、実行中のプログラムの戻りコードを提供するユーティリティがありません。
私が考えることができる最良かつ最も簡単な方法は、内部でサブシェルを実行しbash
(少し混乱しているようですが、私を信じてください)、内部で目的のプログラムを実行し、bash
外部シェルを使用して戻りコードを処理することです。これは以下の通りです。 :
urxvt -e bash -c ' (exit 4) ; echo $? > error.code '
これで、ファイルから戻りコードを読み取ることができますerror.code
。
echo
コードを返すと、urxvt
数千秒後に閉じるウィンドウにコードが印刷されるため、一時ファイルが必要です。だからあなたは役に立つものを得ることはできません。
答え2
これはParsa Mousaviの答えの拡張です。タスクの実行中にそれより複雑なタスクを実行すると、引用符を追跡できない可能性がexit 4
あります。
より柔軟なオプションは次のとおりです。
#!/bin/bash
myfunc(){
(
#Other statements...
exit 4
)
echo $? > errorcode
}
export -f myfunc
uxrvt -e bash -c 'myfunc'
echo "Error code:"
cat errorcode
bash
新しい端末で実行されているプログラムもこの機能を取得するにはエクスポートが必要です。
POSIX シェルは関数のエクスポートを許可しません。移植可能な代替手段として、単純化のために同じディレクトリに2つのスクリプトを作成します。
main
:
#!/bin/sh
urxvt -e sh -c './secondary'
echo "Error code of secondary:"
cat errorcode
secondary
:
#!/bin/sh
myfunc(){
#Here your statements...
exit 4
}
(myfunc)
echo $? > errorcode
実行可能(chmod +x main secondary
)と実行の両方を作成します./main
。あなたは資格があります
Error code of secondary:
4
サブシェルで実行されることに注意してくださいmyfunc
。それ以外の場合、プログラムは終了し、そのecho $?
行は実行されません。