2012-10-21 15 views
29

通知スクリプトを強化しようとしています。スクリプトの仕組みは、長時間実行されているシェルコマンドの後ろに置いて、長時間実行されたスクリプトの終了後にあらゆる種類の通知が呼び出されるというものです。別のスクリプトで最後のシェルコマンドの終了コードを取得する

例えば:

sleep 100; my_notify 

長時間実行されるスクリプトの終了コードを取得するにはいいだろう、問題はmy_notifyを呼び出すと$?変数へのアクセス権を持っていない新しいプロセスを作成することです。

は比較:

~ $: ls nonexisting_file; echo "exit code: $?"; echo "PPID: $PPID" 
ls: nonexisting_file: No such file or directory 
exit code: 1 
PPID: 6203 

~ $: ls nonexisting_file; my_notify  
ls: nonexisting_file: No such file or directory 
exit code: 0 
PPID: 6205 

my_notifyスクリプトはそれで次のようにあります。

#!/bin/sh 
echo "exit code: $?" 
echo "PPID: $PPID" 

私はの終了コードを取得する方法を探しています前のコマンドはコマンドの構造をあまり変更しないでください。私はそれがもっとtimeのように働くように変更すると、私は事実を認識しています。 my_notify longrunning_command...私の問題は解決するだろうが、私は実際にコマンドの最後にそれをつけることができ、この2番目の解決の複雑さを恐れる。

これは実行できますか、それとも基本的にシェルが動作する方法と互換性がありますか?

私のシェルはzshですが、私はbashと同様に動作したいと思います。

答えて

31

これを達成するには、本当にシェル関数を使用する必要があります。そのような単純なスクリプトの場合、zshとbashの両方で動作させるのはかなり簡単です。

my_notify() { 
    echo "exit code: $?" 
    echo "PPID: $PPID" 
} 

次に、シェルの起動ファイルからそのファイルを入手してください。これは対話シェルから実行されるため、$ PPIDではなく$$を使用することができます。

6

互換性がありません。 $?のみが現在のシェル内に存在します。サブプロセスで使用できるようにするには、環境変数にコピーする必要があります。

代わりに、代わりに何らかの方法でそれを使用するシェル関数を記述することです。

2

これを実装する方法として、EOFタグとmy_notifyスクリプトを作成するマスタースクリプトを使用する方法があります。


#!/bin/bash 

if [ -f my_notify ] ; then 
rm -rf my_notify 
fi 

if [ -f my_temp ] ; then 
rm -rf my_temp 
fi 

retval=`ls non_existent_file &> /dev/null ; echo $?` 
ppid=$PPID 
echo "retval=$retval" 
echo "ppid=$ppid" 
cat >> my_notify << 'EOF' 
#!/bin/bash 

echo "exit code: $retval" 
echo " PPID =$ppid" 
EOF 

sh my_notify 

あなたはあなたの目的のために、このスクリプトを絞り込むことができます。

関連する問題