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의 출력을 명령으로 실행하기를 바랍니다.