我不是很熟悉exec
。我正在运行一些测试和示例。我想将写入文件的命令传递给它。我期望该命令的运行方式exec
就像直接在命令行上运行一样。这是我设置并尝试过的:
[kellyry@ch12ldvela00 ~]$ cat exec_test
ls
[kellyry@ch12ldvela00 ~]$ cat exec_test | exec
[kellyry@ch12ldvela00 ~]$ cat exec_test | xargs exec
xargs: exec: No such file or directory
[kellyry@ch12ldvela00 ~]$ exec ls
exec_test file2 file3
. . .
这是最奇怪的部分。运行最后一行exec ls
不会返回。那是终端挂起,我无法与其通信。我认为最后一个问题可能是 Mobaxterm 的问题,我用它来 ssh 到服务器。
答案1
从bash
联机帮助页:
exec [-cl] [-a name] [command [arguments]]
如果
command
指定,它将替换外壳。没有创建新进程。[...]
如果
command
不指定,则任何重定向都在当前 shell 中生效,返回状态为 0。
管道到exec
你尝试的第一件事是
cat exec_test | exec
这会发送ls
到exec
标准输入,而不是作为参数。 exec
运行时不带任何参数,并且没有重定向,因此它什么也不做。
如果您想运行(或“执行”)文件中的命令,那不是目的exec
。您可以使用source
(或缩写.
)来做到这一点:
source exec_test
管道到xargs exec
你尝试的下一件事
cat exec_test | xargs exec
exec
是一场狂欢内置。它仅在 bash 中可用,因此xargs
无法找到它来执行它。
exec
在主外壳中
最后,你尝试了
exec ls
这运行了ls
,然后挂起了终端。这是因为,正如记录的那样,它取代了 shell 进程。完成后ls
,终端中不再有任何运行。 (某些终端模拟器此时会自动关闭。幸运的是,您的终端模拟器没有关闭,因此您仍然可以看到输出。)
这你试图遵循的例子有一个额外的步骤:
bash
exec ls
这首先启动一个新的bash
,作为“顶级”的子级运行。然后exec ls
替换该 shell,然后退出。然后父 shell 会恢复,这样您就不会遇到卡住的终端了。