通过使用“eval”调用的函数,在 bash 中依次运行两个命令

通过使用“eval”调用的函数,在 bash 中依次运行两个命令

我在 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 的输出作为命令执行

相关内容