管道到exec

管道到exec

我不是很熟悉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

这会发送lsexec标准输入,而不是作为参数。 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 会恢复,这样您就不会遇到卡住的终端了。

相关内容