在 bash中运行exec echo "some "; echo "test"
从不打印“一些测试”吗?
我会寻求对这个问题的确认,因为我正在编写一个小的 shell 脚本,并且我希望它在exec
调用命令后不会继续任何事情。
根据我的理解,我认为在咨询后无需担心:
man 3 exec
man 1p exec
shell 脚本,当由 shell 执行时,将
- shell执行程序
exec
,它 - 使用
exec***
家族系统调用来替换执行脚本的 shell/bash,从而阻止shell 的进一步操作(被“替换”)
如前所述,这个问题的主要目标是寻求对我的推理的确认,以防止脚本中在 exec 之后发生的任何事情(例如echo test
)将被执行。
我会尽可能地欣赏一个一般性的答案(POSIX),但就特殊情况而言,我对 GNU/Linux 和 GNU/Bash 最感兴趣
对了,如果
exec
成功,就替换当前的shell,所以下面的命令没有,err..执行。但是,至少在 Bash 中,如果
exec
失败,shell 也会退出:因此,即使是类似的东西
bash -c 'exec /bin/nosuchfile; echo foo'
也只会打印有关丢失的程序文件的错误消息。要处理脚本中的错误,您需要类似但是,您仍然会从
exec
. 如果您在 上放置重定向,如果脚本在失败后继续exec
,它仍然有效。exec
内置(
exec
带有命令参数¹)替换了 shell 进程²。不执行 shell 进程中的后续代码。exec echo "some "; echo "test"
因此,打印的唯一方法some text
是如果echo
在 PATH 中调用了一个可执行命令,并且打印的是这个可执行文件some text
而不是some
. 在正常情况下,echo
可执行文件的行为与人们对名为echo
.如果
echo
PATH 中没有调用可执行文件或执行失败,exec
则会显示错误消息并退出 shell。即使在那种情况下,echo "test"
也不执行。¹没有命令参数是另一种野兽。它不会取代 shell 进程,它只是应用重定向。 ²在子shell中,只有子shell受到影响,父shell保持正常运行。
exec
exec
如果它执行命令并且成功地完成了脚本,它总是会完成脚本(与命令的退出代码无关,但与启动它无关)。exec
可以在没有命令的情况下以非常有用的方式运行:永久重定向文件描述符:如果无法启动命令,则 shell 行为取决于配置。
bash
默认退出。您最好改用函数: