백슬래시로 이스케이프된 공백이 포함된 경로의 디렉터리를 문자열 변수에 저장된 작업 디렉터리의 하위 디렉터리로 복사하려고 시도하는 스크립트가 있습니다.
스크립트를 실행하면 다음과 같은 사용법이 나타납니다 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
둘 다 동일한 결과를 생성해야 합니다.