我不是很熟悉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 會恢復,這樣您就不會遇到卡住的終端了。