명령용 Bash 확장인 ${@}

명령용 Bash 확장인 ${@}

부모 스크립트가 있습니다

while read cmd 
do
  nohup ./script ${cmd[@]} &>> log &
done < ~/list 

이 첨자를 실행하세요

while true
do 
  eval "${CMD[@]}"
  #${CMD[@]}
  #./panic
done

이 명령 목록으로

node ~/www/splash/app.js
node ~/www/splash-two/app.js

첨자가 호출되면 eval ${CMD[@]}아무런 불만 없이 예상대로 명령이 실행되지만 eval을 제거하고 ${CMD[@]}명령을 실행하려고 하면 오류가 발생합니다.

Error: Cannot find module '/home/rumplefraggle/SYS/RABBOT/~/www/splash/app.js'

이제 이것이 노드 명령과 관련이 있을 수 있다고 생각하여
ls ~
명령으로 실행을 시도했지만 ~찾을 수 없음 오류가 발생했습니다.

실행하지 않고 에코하면 ${@}예상대로 확장됩니다.

또는 명령을 아래 첨자에 수동으로 삽입하면 예상대로 작동합니다.

eval왜 작동하는지 이해할 수 없으며 단순히 명령으로 실행해도 ${@}작동하지 않습니다. ${@}확장할 수 없는 원인은 무엇입니까 ~?

${@}노드를 사용할 때 명령에 디렉터리 이름을 추가하는 이유는 무엇입니까?

답변1

이는 물결표 확장 때문입니다. eval은 물결표를 확장하여 홈 디렉터리의 전체 경로로 바꿉니다. 이것이 없으면 명령은 전달된 리터럴 물결표를 사용하고 존재하지 않는 상대 경로를 사용하려고 시도합니다.

$ echo ~
/home/chris
$ echo "~" 
~
$ eval 'echo ~' 
/home/chris 

답변2

견적이 필요합니다:"${cmd[@]}"

따옴표가 없으면 배열의 모든 요소가 단일 문자열로 압축됩니다. 따옴표를 사용하면 각 요소가 개별적으로 올바르게 처리됩니다.

~에서수동:

만약에아래 첨자is ‘@’또는 인 경우 ‘*’이 용어는 배열의 모든 구성원으로 확장됩니다.이름. 이러한 아래첨자는 단어가 큰따옴표 안에 나타날 때만 다릅니다. 단어를 큰따옴표로 묶은 경우[...] ${name[@]}이름의 각 요소를 별도의 단어로 확장합니다.

관련 정보