2012-07-27 380 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