包装脚本中执行的原因


27

我看过以下概括的包装器脚本示例:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

exec "$myprog" "$@"

如上所示,它们用于exec几乎立即用替换新创建的外壳$myprog。如果没有exec以下内容,则可以实现相同的目的:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

"$myprog" "$@"

在最后一个示例中,启动了一个新的bash实例,然后$myprog将其作为bash实例的子进程启动。

第一种方法的好处是什么?



另外(在站点上!):Shell的execbuildin的用例/实际示例
斯科特

Answers:


31

使用exec可使包装程序更加透明,即,使调用脚本的用户或应用程序不太需要知道是中继程序继而启动“真实”程序的可能性较小。

特别是,如果调用者想要终止该程序,则将终止其刚刚启动的进程。如果包装器脚本运行一个子进程,则调用者将需要知道他们应该找出包装器的子进程并将其杀死。包装器脚本可以设置陷阱以中继某些信号,但是不能与无法捕获的SIGSTOP或SIGKILL一起使用。

调用exec还节省了一些内存(以及其他资源,例如PID等),因为它不需要保留多余的外壳而无所事事。

如果有多个包装器,那么问题就会加起来(难以找到合适的进程来终止进程,增加内存开销等)。

一些外壳程序(例如Korn外壳程序)会自动检测命令何时是最后一个命令,并且没有活动的陷阱exec,而是放置一个隐式,但并非所有命令都可以(例如,不是bash)。


10

没有发现重复...请参阅FreeBSD手册,该手册给出了充分的理由:

exec语句将Shell进程替换为指定程序。如果exec省略,则外壳程序进程将在程序执行时保留在内存中,并且不必要地消耗系统资源。

从根本上来说,这是我(由一位搬运工)向我解释的原因,并且是众所周知的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.