我想建立一個 bash 腳本或類似的腳本,可以在目前 shell 中執行:
echo '#!/bin/bash
export foo="bar" ' > zoom.sh
但如果我想在當前進程中運行這個腳本:
exec ./zoom.sh
那麼我的終端將退出“進程完成”,即使我使用set +e
,它仍然退出。
和source
whicheval
將在當前 shell 中運行內容,所以也許 eval 是我最好的選擇? bash 函數可以工作 - 但我source
首先必須依賴使用者來使用它。
答案1
從手冊來看,exec 不會建立新進程,它只是取代目前的 shell,因此執行後它也會終止會話。
exec [-cl] [-a name] [command [arguments]]
:
如果指定了命令,它將取代 shell。沒有建立新進程。這些參數成為命令的參數。如果提供了 -l 選項,shell 會在傳遞給指令的第 0 個參數的開頭放置一個破折號。這就是登入(1)的作用。此-c
選項導致命令在空環境中執行。如果-a
提供,shell 將 name 作為第 0 個參數傳遞給執行的命令。如果由於某種原因無法執行命令,則非互動式 shell 將退出,除非execfail
啟用了 shell 選項,在這種情況下它將返回失敗。如果檔案無法執行,互動式 shell 將會傳回失敗。如果不指定command,則任何重定向都在目前shell中生效,回傳狀態為0。
$ cat zoom.sh
#!/bin/bash
export foo="bar"
echo $?
$ exec ./zoom.sh
0
Connection to localhost closed