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の出力をコマンドとして実行することを願っています。