Bash
在 bash 中通過一個用 eval 呼叫的函式依次執行兩個命令
我在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 的輸出作為命令執行