Exec

exec 命令不接受 xargs,掛在命令輸入上

  • March 12, 2020

我不是很熟悉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 到伺服器。

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內置的。它僅在 bash 中可用,因此xargs找不到它來執行它。

exec在主殼中

最後,你嘗試了

exec ls

這跑了ls,然後掛了終端。這是因為,如文件所述,它取代了 shell 程序。ls完成後,終端中不再執行任何內容。(此時有些終端模擬器會自動關閉。幸運的是,你的沒有關閉,所以你仍然可以看到輸出。)

您嘗試遵循的範例有一個額外的步驟:

bash
exec ls

這首先啟動一個新的bash,作為“頂級”的子執行。然後exec ls替換該外殼並退出。然後父外殼恢復,所以你不會留下一個卡住的終端。

引用自:https://unix.stackexchange.com/questions/572563