「eval」で呼び出される関数を使用して、bashで2つのコマンドを順次実行します。

「eval」で呼び出される関数を使用して、bashで2つのコマンドを順次実行します。

Bashで2つのコマンドを順番に実行するのに問題があります。私が走るとき

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はサブシェルで実行されるため、変数の内容はサブシェルと共に消えます。

今、それが必要ですかeval?このshufコマンドは、関数と同じ名前の文字列を生成します。次のように書くことができます。

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

または単に

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

最後のケースでは、するシェルがshufの出力をコマンドとして実行することを願っています。

関連情報