我在 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")"
然后我得到想要的输出。
我究竟做错了什么?
我已经得到了暗示
答案1
除了语法问题之外,这就是您的调用方式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 的输出作为命令执行