printf -v는 Bitbucket 파이프라인에서 잘못된 옵션입니다. <<[닫기]에 대한 또 다른 질문이 있습니다.

printf -v는 Bitbucket 파이프라인에서 잘못된 옵션입니다. <<[닫기]에 대한 또 다른 질문이 있습니다.

안녕하세요, 저는 쉘 스크립팅을 처음 접했습니다. 사소한 일이었다면 죄송합니다. printf옵션과 함께 명령을 사용하는 방법은 무엇입니까 -v?

우리 deployment.sh파일에는 다음 줄이 있습니다 printf -v BITBUCKET_COMMIT_str %q "$BITBUCKET_COMMIT"

echo 'Initializing new deployment'
printf -v BITBUCKET_COMMIT_str %q "$BITBUCKET_COMMIT"
echo "commit string $BITBUCKET_COMMIT_str"

Bitbucket 파이프라인이 실행되면 항상 이 줄에서 실패합니다. 오류가 있습니다 printf -v is an illegal option.

Bitbucket의 오류


Initializing new deployment
commit string 
deployment.sh: 28: printf: Illegal option -v
bash: -c: line 1: syntax error: unexpected end of file
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! XXXXX deploy: `sh deployment.sh`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the XXXX deploy script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/XXX-debug.log

로컬 터미널에서 명령을 테스트 했는데 printf -v제대로 작동하는데 Bitbucket 빌드 파이프라인에서는 왜 작동하지 않는지 모르겠습니다. 변수로 바꾸려고 시도했지만 printf파일에 구문 오류가 발생했습니다. 변수를 다른 명령의 입력으로 사용하려고 하기 때문인 것 같습니다.

"bash -s $BITBUCKET_COMMIT_str" <<\HERE
     echo "TEST MADE IT HERE"
     BUILD_FOLDER="BUILD_$BITBUCKET_COMMIT"
     echo "Build: $BUILD_FOLDER"
    ...
    HERE

반면에 위 스크립트가 무엇을 하려는지 완전히 확신할 수 없습니다. 이 bash -s명령 이 무엇을 하는지는 찾지 못했습니다 . 내 생각엔 이 명령이 HERE청크 콘텐츠가 포함된 파일을 추가하려는 것 같습니다 . "블록 내부의 코드가 실행되는 것으로 나타남"으로 변경하지 않으면 블록 내부의 스크립트가 실행되지 않는 것 같습니다 HERE. 그러나 내가 이해하는 한, 이러한 변화는 실제로 의미가 없습니다.<<>>HERE<<

어떤 도움이라도 대단히 감사하겠습니다. 우리 팀 대부분이 휴가 중이어서 힘든 시간을 보내고 있습니다. 미리 감사드립니다 :)

답변1

printf -v BITBUCKET_COMMIT_str %q "$BITBUCKET_COMMIT"
echo "commit string $BITBUCKET_COMMIT_str"

deployment.sh: 28: printf: Illegal option -v

이는 데비안 Dash의 오류 메시지처럼 보입니다 /bin/sh. 문제는 스크립트 시작 부분의 해시뱅이 맞다는 것입니다. 하지만 이미 댓글에서 언급하셨는데요.

해결 방법 -v은 명령 대체를 사용하는 것이지만 Dash가 이를 지원하지 않고 확장도 지원되지 않기 때문에 교체하기가 약간 어렵기 var=$(printf whatever)때문에 문제가 발생합니다 .%q${var/pattern/replacement}

그런데 다음 줄을 보세요. 이 변수를 사용하여 BITBUCKET_COMMIT_str사용자에게 인쇄합니다. 쉘 입력에 대해 인용이 유효할 필요는 없습니다 %q. 이는 필수입니다. ( %q예쁜 출력을 생성하지도 않으며 작은 따옴표보다 백슬래시를 선호합니다.) 따라서 변수를 사용하는 유일한 장소이고 개행 문자가 포함되어 있지 않은 경우(커밋 ID인 경우) 또는 이 방법 , 그렇지 않을 수도 있음), printf완전히 건너뛰고 다음과 같이 사용할 수 있습니다.

echo "commit string '$BITBUCKET_COMMIT'"

만약 너라면진짜Bash는 필수 %q이고 Bash는 완전히 사용 가능합니다. 명백하지만 매우 과감한 해결책은 Bash를 호출하여 이 작업을 수행하는 것입니다.

quotedvar=$(bash -c 'printf %q "$1"' bash "$var")

관련 정보