エラーコードを端末の外に伝播するにはどうすればよいですか?

エラーコードを端末の外に伝播するにはどうすればよいですか?

Bashスクリプト内の新しいターミナルウィンドウで起動されたプログラムのエラーコードを取得しようとしています。次のように単純化できます。

#!/bin/bash
urxvt -e bash -c "exit 4"
echo $?

出力:0

urxvtを呼び出すスクリプトから「4」にアクセスしたいです。どうすればいいですか? :)

答え1

uxvrtAFAIKグラフィックターミナルには、実行中のプログラムの戻りコードを提供するユーティリティがありません。

私が考えることができる最良かつ最も簡単な方法は、内部でサブシェルを実行し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 $?行は実行されません。

関連情報