Bash

在 bash 中通過一個用 eval 呼叫的函式依次執行兩個命令

  • April 5, 2021

我在bash中一個接一個地執行兩個命令時遇到問題。當我跑

source2() { '/home/ds/Documents/scripts/Untitled Document 1.sh' && imgpath="$(ls | grep "^unsplash")" }

source3()  {  '/home/ds/Documents/scripts/Untitled Document 2.sh' && imgpath="$(ls | grep "^1920x1080" | shuf -n 1)" }

source4()   {  '/home/ds/Documents/scripts/Untitled Document 3.sh' && imgpath="$(ls | grep "^unsplashimg")" }



SOURCES=("source2" "source3" "source4")
$(eval $(shuf -n1 -e "${SOURCES[@]}"))
echo $imgpath

bash 腳本部分執行,但之後的部分&&沒有執行,因此echo $imgpath沒有輸出。當我執行單個命令時

'/home/ds/Documents/scripts/Untitled Document 1.sh' && imgpath="$(ls | grep "^unsplash")"

然後我得到想要的輸出。

我究竟做錯了什麼?

我已經從

除了語法問題,這就是您的呼叫方式eval

$(eval $(shuf -n1 -e "${SOURCES[@]}"))

外部$(...)意味著 eval 發生在子 shell 內,然後目前 shell 獲取輸出並將作為命令執行。

因為 eval 在子 shell 中執行,所以變數的內容會隨著子 shell 消失。

現在,你需要eval嗎?該shuf命令將生成一個與函式同名的字元串。你可以改寫:

func=$(shuf -n1 -e "${SOURCES[@]}") && "$func"

或者乾脆

$(shuf -n1 -e "${SOURCES[@]}")

在最後一種情況下,我們確實希望 shell 將 shuf 的輸出作為命令執行

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