2012-07-27 29 views
6

exitコマンドが同じスクリプト()で実行された後に実行するシェルスクリプトでコマンドを実行している状況があります。私はそれはクレイジーに聞こえる!!知っている!!)私はexit $?の実行後コマンドはtouch ~/abc.txt実行したいここでシェルスクリプト:シェルスクリプトでexitコマンドを実行した後でコマンドを実行

#!/bin/sh 
ls -l ~/. 
exit $? 
touch ~/abc.txt 

のようなもののためのソリューションやコマンドを見つけたい

touch ~/abc.txtすることができ任意のコマンド。

制約: 1)上記スクリプトのexit $?部分を変更することはできません。 2)コマンドはexit $?コマンドの後に実行する必要があります。

解決策があるかどうかわかりませんが、助けていただければ幸いです。

+0

なぜこれらの最初の行を変更できないのか分かりますか? – arkascha

+0

申し訳ありません!今私の質問の制約部分を編集しました。私はスクリプト内の何かを変更することができますが、終了コマンドは残っている必要があります! – latestVersion

+0

スクリプトを変更できない場合は、どのように 'touch'コマンドを追加すると思いますか?スクリプトを変更できない場合は、なぜそれを 'exit'の上に追加できませんか? – Shahbaz

答えて

10

典型的なアプローチは、トラップを設定することです:

trap 'touch ~/abc.txt' 0 

時にシェルが終了これは、touchコマンドを呼び出します。いくつかのシェル(例えば、bash)では、シグナルの結果としてスクリプトが終了した場合でもトラップが実行されますが、他のシェルでは(例えばdash)トラップは実行されません。最後のコマンドがexitだった場合にのみ、コマンドを呼び出す移植性のある方法はありません。

+0

ありがとうございます!これは役に立ちます。 – latestVersion

0

いずれにせよ直接的な方法は可能ではないかと疑います。

ただし、回避策がある可能性があります。実行中のスクリプトを別のプロセスでラップすることはできますか?ラップされたスクリプトがexit()を実行し、スタックから削除されたら、ラッピングスクリプトで必要なものを呼び出すことができます。

1

私はあなたがそのようなことをしたいとは思っていませんが、おそらくこのようなものを試してみてください。別のスクリプトでスクリプトをラップしてください。あなたの親スクリプトでは、evalやsourceのようなコマンドで子スクリプトを評価し、最後に子スクリプトから最後のコマンドを抽出し、別々に実行します。

+0

+1:抽出トリックはこの答えを私のものより良くします。 – arkascha

+0

vFabric tcServerの "tcruntime-ctl.sh"スクリプトを修正しているので、スクリプトにラッパーを使用することはできません。 – latestVersion

+0

私はこのスクリプトだけを修正するようになりました! : – latestVersion

0

OPが出口を移動したくない場合でも、これはうまくいくはずです。

#!/bin/sh 
ls -l ~/. 
RES=$?  #save res for later. 
touch ~/abc.txt 
exit $RES 
関連する問題