Shell脚本:在运行“exit”命令后执行命令的方式

7

我有一个情况,我的shell脚本中有一个命令必须在同一脚本中执行exit命令后才能执行(我知道!!听起来很疯狂!!

我想找到一个解决方案,类似于

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

我希望在运行命令 exit $? 后执行命令 touch ~/abc.txt,其中 touch ~/abc.txt 可以替换为任意命令。

约束条件:1)不能修改以上脚本中的部分 exit $?。2)命令必须在 exit $? 命令之后执行。

我不确定是否有解决方案,但非常感谢您的帮助。


请问您为什么不能修改那些前几行? - arkascha
抱歉!我现在已经编辑了我的问题的约束部分。我可以更改脚本中的任何内容,但是退出命令必须保留!! - latestVersion
如果您无法修改脚本,那么您如何期望添加“touch”命令呢?如果您可以修改脚本,为什么不能在“exit”上方添加它呢? - Shahbaz
这并没有任何意义,你显然只是试图改变症状而不是解决问题。你想要实现什么?为什么你想要这样做? - arkascha
4个回答

10

典型的做法是设置陷阱:

trap 'touch ~/abc.txt' 0

当shell退出时,这将调用touch命令。在某些shell(例如bash)中,如果脚本由于信号而终止,则陷阱也将被执行,但在其他shell(例如dash)中不会执行。没有可移植的方法只在最后一个命令是exit时调用该命令。


1
我不知道你为什么想做这样的事情,但也许可以尝试像这样:将你的脚本包装在另一个脚本中。在你的父脚本中使用 eval 或 source 命令评估你的子脚本,然后从你的子脚本中提取最后一个命令并以同样的方式单独执行它。

虽然我很想这么做,但我无法在脚本中使用包装器,因为我正在修改 VFabric tcServer 的 "tcruntime-ctl.sh" 脚本。 - latestVersion
我现在只能修改这个脚本!:( - latestVersion
@latestVersion 为什么你不能修改那个? - arkascha
@latestVersion 这是一个疯狂的想法,但也许可以将评估命令放在同一脚本中。就像执行(这个脚本的所有其他行)然后执行最后一行一样。 - Nykakin
我不能随意更改脚本的某些部分,其中 exit $? 就是其中之一。我遇到了这样一种情况:当执行 exit $? 命令时,会产生一个“输出”。这个“输出”不在我的控制范围内,它是 Java 程序的一部分。现在,我想在 exit $? 命令执行后运行一个命令,并且它必须是同一个脚本的一部分,因为我受到了不能引入其他内容到项目中的限制。我束手无策! - latestVersion

0

这应该可以工作,即使 OP 不想移动退出。

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

0

我怀疑直接的方式可能无法实现。

但是可能有一个解决方法:您能否将执行脚本包装在另一个进程中?然后,一旦包装脚本执行其exit()并从堆栈中删除,您就可以在包装脚本中调用任何您想要的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接