/usr/bin/find 명령 대체와 함께 사용하면 호출이 작동하지 않습니다.

/usr/bin/find 명령 대체와 함께 사용하면 호출이 작동하지 않습니다.

스크립트에는 다음이 있습니다.

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.

관련 정보