2012-10-21 31 views
29

我想加強我的通知腳本。腳本的工作方式是將它放在長時間運行的shell命令後,然後在長時間運行腳本完成後調用各種通知。在另一個腳本中獲取最後一個shell命令的退出代碼

例如:

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...我的問題會得到解決,但我確實喜歡我可以在命令結束時加以解決,並且我擔心這個第二種解決方案的複雜性。

這是可以做到的,還是與根本上不符合貝殼的工作方式?

我的外殼是zsh,但我希望它能與bash一起工作。

回答

31

你真的需要使用shell函數才能完成。對於一個簡單的腳本來說,它應該很容易在zsh和bash中運行。只需將以下內容放在一個文件中:

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

然後從您的shell啓動文件中獲取該文件。雖然從交互式shell中運行,但可能需要使用$$而不是$ PPID。

6

它是不相容的。 $?只有存在於當前shell中;如果您希望它在子進程中可用,那麼您必須將其複製到環境變量中。

另一種方法是編寫一個shell函數,以某種方式使用它。

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 

你可以爲你的目的細化這個腳本。

相關問題