스크립트에는 다음이 있습니다.
CMD='/usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \; '
MD5=$("${CMD}")
하지만 스크립트에서 오류가 발생합니다.
-bash: /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \; : No such file or directory
그러나 명령줄에 그대로 입력하면 $CMD의 내용이 작동합니다.
/usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \;
md5 해시 목록을 올바르게 생성합니다.
문자열에서 백슬래시와 세미콜론을 피하는 것을 포함하여 제가 생각할 수 있는 모든 것을 시도했지만 제대로 작동하지 않는 것 같습니다.
또한 백틱을 사용하여 명령을 호출해 보았지만 결과는 변경되지 않았습니다.
내가 뭘 잘못했나요?
답변1
작은따옴표(공백 포함) 사이의 전체 문자열은 오류가 나타내는 것과 정확히 동일하게 bash가 실행하는 바이너리/스크립트에서 검색됩니다. 즉, /usr/bin/find
시작하려는 매개변수로 시작을 시도하지 않습니다 /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \;
.
답변2
큰따옴표 안에 사용했기 때문에 "${CMD}"
확장 결과가 수행되지 않았습니다.$CMD
필드 분할(그리고파일 이름 확장자), 전체 문자열이 /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \;
실행할 명령으로 처리됩니다. 그렇게 명명된 명령이 없으므로 쉘이 보고합니다.해당 파일이나 디렉터리가 없습니다.실수.
다음을 사용하므로 배열을 사용하는 것이 좋습니다 bash
.
$ CMD=( /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \; )
$ "${CMD[@]}"
또는 POSIXly에서는 다음을 사용합니다 "$@"
.
$ set -- /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \;
$ "$@"
첫 번째 경우에는 $CMD
큰따옴표 없이도 할 수 있지만권장되지 않음, 실패하기 쉬움. 최소한 set -f
실행하기 전에 이 작업을 수행해야 합니다 $CMD
.