공백이 포함된 경로를 cp로 설정하려고 하면 스크립팅 시 실패하지만 에코 및 붙여넣기는 성공적으로 수행됩니까? [폐쇄]

공백이 포함된 경로를 cp로 설정하려고 하면 스크립팅 시 실패하지만 에코 및 붙여넣기는 성공적으로 수행됩니까? [폐쇄]

백슬래시로 이스케이프된 공백이 포함된 경로의 디렉터리를 문자열 변수에 저장된 작업 디렉터리의 하위 디렉터리로 복사하려고 시도하는 스크립트가 있습니다.

스크립트를 실행하면 다음과 같은 사용법이 나타납니다 cp.

usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory

그러나 명령을 에코하면 완전히 올바른 것처럼 보입니다. 그런 다음 에코된 줄을 복사하여 터미널에 다시 붙여넣어도 정상적으로 실행됩니다!

rm -rf Payload
mkdir Payload
echo cp -Rf $APP_PROTOTYPE/ Payload/${BUNDLE_NAME}.app
cp -Rf $APP_PROTOTYPE/ Payload/${BUNDLE_NAME}.app

Bash에서 왜 올바르게 실행되지 않는지 이해할 수 없지만 수동으로 명령을 붙여넣는 것은 완벽하게 작동합니다. 또한 수동으로 수행하면 제대로 작동하기 때문에 문제가 무엇인지조차 알 수 없습니다(그러나 분명히 공백이 의심됩니다). cp도움이 된다면 종료 코드는 64입니다.

$APP_PROTOTYPE처럼 보입니다 .golden_repo/Production\ Releases\ Only/Kiosk/1.0.3/Prototype/Kiosk.app. 이는 .golden_repo마운트된 smbfs 공유입니다.

답변1

단어 분할로 인해 두 개의 다른 인수가 생성되는 것을 방지하려면 공백이 포함된 명령 부분을 인용해야 합니다.

cp -Rf "$APP_PROTOTYPE/" "Payload/${BUNDLE_NAME}.app"

당신이 원하는 것을해야합니다. 따옴표 내에서 변수 보간을 허용하려면 작은 따옴표 대신 큰 따옴표가 필요합니다.

출력은 echo명령이 올바르게 작동해야 함을 의미하지 않습니다. 경로명 처리와 달리 cp단어 echo분할로 인해 하나의 매개변수가 여러 매개변수가 되는 것은 완전히 괜찮습니다.

echo 'a b'

그리고

echo a b

둘 다 동일한 결과를 생성해야 합니다.

관련 정보