부모 스크립트가 있습니다
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[@]}
이름의 각 요소를 별도의 단어로 확장합니다.