我正在使用 atmpfile
并将其传递到my_exe
我的 shell 脚本中。我需要删除终止tmpfile
后的内容my_exe
,所以我使用trap "rm $tmpfile" exit
.
我还需要防止my_exe
关闭终端时关闭,所以我使用nohup my_exe $tmpfile &
.但是,由于这导致我的脚本终止,因此在读取它$tmpfile
之前立即将其删除my_exe
。它是这样的:
#!/bin/bash
tmpfile=$(mktemp)
trap "rm $tmpfile" exit
echo "aaa" > $tmpfile
nohup my_exe $tmpfile &
如何配置trap
命令以使其实际等待my_exe
终止?
答案1
脚本的最后一行my_exe
在后台调用。这意味着调用my_exe
立即返回成功代码。
据您的脚本所知,my_exe
已被调用并成功完成其工作。您的脚本没有其他命令要执行,因此您的脚本退出,这会触发删除临时文件的陷阱。
您无法将陷阱配置为按照您要求的方式运行,因为 trap 不是外部命令。它是运行脚本的 shell 的内部函数。为了使陷阱函数等待my_exe
完成,脚本必须等待my_exe
完成。
既然您说过要在my_exe
运行时关闭终端,我建议您从调用行中删除 & my_exe
。您的脚本将等待my_exe
临时文件的使用完成。相反,请使用 & 在后台运行脚本。
可能需要进行一些实验才能使其按照您想要的方式运行。我建议使用调用的脚本版本进行测试,/bin/sleep 15
而不是my_exe
验证您可以关闭终端窗口而不终止进程,并且临时文件在正确的时间被删除。