如何在目前 shell 中執行某些操作

如何在目前 shell 中執行某些操作

我想建立一個 bash 腳本或類似的腳本,可以在目前 shell 中執行:

 echo '#!/bin/bash 
  export foo="bar" ' > zoom.sh

但如果我想在當前進程中運行這個腳本:

exec ./zoom.sh

那麼我的終端將退出“進程完成”,即使我使用set +e,它仍然退出。

sourcewhicheval將在當前 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

相關內容