2012-07-27 378 views
6

我有一種情況,在我的shell腳本中有一個命令,必須在退出命令在同一腳本中執行後執行(我知道!!這聽起來很瘋狂!Shell腳本:在shell腳本中運行「exit」命令後執行命令

我想找到像

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

這裏的東西的解決方案我想命令touch ~/abc.txt執行exit $?運行後,命令touch ~/abc.txt可任何命令。

限制條件: 1)我無法修改上述腳本的exit $?部分。 2)命令必須在命令exit $?後執行。

我不確定是否有解決方案,但任何幫助表示讚賞。

+0

請問我們爲什麼不能修改這些第一行? – arkascha 2012-07-27 12:07:11

+0

對不起!我現在編輯了我的問題的約束部分。我可以更改腳本中的任何內容,但退出命令必須保留! – latestVersion 2012-07-27 12:20:51

+0

如果你不能修改腳本,你期望添加'touch'命令嗎?如果您可以修改腳本,爲什麼不能將它添加到'exit'之上? – Shahbaz 2012-07-27 12:25:42

回答

10

的典型方法是設置一個陷阱:

trap 'touch ~/abc.txt' 0 

這將調用觸摸命令shell退出時。在某些shell中(例如bash),如果腳本因信號而終止,陷阱也將被執行,但在其他shell中(例如dash)則不會。只有最後一條命令是exit時,纔有可調用該命令的便捷方式。

+0

謝謝!這有助於。 – latestVersion 2012-07-30 09:32:31

0

我懷疑直接的方式是可能的任何方式。

但是可能有一種解決方法:您是否可以將執行腳本包裝在另一個進程中?然後,一旦包裝腳本執行了exit()並從堆棧中移除,就可以在包裝腳本中調用任何你想要的東西。

1

我不知道你爲什麼要這樣做,但也許嘗試這樣的事情:包裝你的腳本在另一個。在您的父母腳本中使用eval或source等命令評估您的子腳本,然後從您的子腳本上次命令中提取並以相同的方式單獨執行它。

+0

+1:提取技巧使得這個答案比我的更好。 – arkascha 2012-07-27 12:11:58

+0

盡我所能,我不能在腳本上使用包裝器,因爲我正在修改vFabric tcServer的「tcruntime-ctl.sh」腳本。 – latestVersion 2012-07-27 12:22:55

+0

我現在只會修改這個腳本! :( – latestVersion 2012-07-27 12:24:18

0

即使OP不想移動出口,這也應該有效。

#!/bin/sh 
ls -l ~/. 
RES=$?  #save res for later. 
touch ~/abc.txt 
exit $RES