"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은 서브셸에서 실행되므로 변수의 내용은 서브셸과 함께 사라집니다.

지금, 그것이 필요합니까 eval? 이 shuf명령은 함수와 동일한 이름을 가진 문자열을 생성합니다. 다음과 같이 작성할 수 있습니다.

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

아니면 단순히

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

마지막 경우에 우리는하다쉘이 shuf의 출력을 명령으로 실행하기를 바랍니다.

관련 정보