我有一堆包装shell脚本,它们操作命令行参数并在最后调用另一个二进制文件之前做一些事情。有没有理由不在最后exec
二进制文件?看起来这会更简单,更有效,但我从未见过它。
答案 0 :(得分:4)
如果选中/usr/bin
,您可能会发现许多以exec
命令结尾的shell脚本。举个例子,这里是/usr/bin/ps2pdf
(debian):
#!/bin/sh
# Convert PostScript to PDF.
# Currently, we produce PDF 1.4 by default, but this is not guaranteed
# not to change in the future.
version=14
ps2pdf="`dirname \"$0\"`/ps2pdf$version"
if test ! -x "$ps2pdf"; then
____ps2pdf="ps2pdf$version"
fi
exec "$ps2pdf" "$@"
使用 exec
是因为它不需要在不再需要shell进程后保持shell进程处于活动状态。
我的/usr/bin
目录有超过150个使用exec
的shell脚本。因此,使用exec
很常见。
不使用exec
的原因是,在二进制文件执行完毕后,有一些处理要完成。
答案 1 :(得分:4)
我不同意你的评估,这不是一种常见做法。也就是说,它总是是正确的。
我通过执行另一个命令结束脚本但不能合理使用exec
的最常见情况是,如果我需要在之后运行的清理钩子>最后的命令完成。例如:
#!/bin/sh
# create a temporary directory
tempdir=$(mktemp -t -d myprog.XXXXXX)
cleanup() { rm -rf "$tempdir"; }
trap cleanup 0
# use that temporary directory for our program
exec myprog --workdir="$tempdir" "$@"
...在执行后确实没有真正清理tempdir
!将exec myprog
更改为仅myprog
有一些缺点 - 来自shell的持续内存使用,一个额外的进程表条目,信号可能被传递到shell而不是它的程序。正在执行 - 但它也确保shell仍在myprog
的出口处,以运行所需的任何陷阱。