管道到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 會恢復,這樣您就不會遇到卡住的終端了。

相關內容