/bin/bash -ac를 사용하여 컨테이너 셸 원시 및 명령에서 명령을 실행하면 다른 결과를 얻습니다.

/bin/bash -ac를 사용하여 컨테이너 셸 원시 및 명령에서 명령을 실행하면 다른 결과를 얻습니다.

할 때 docker exec -it [container_id] /bin/bash:


폴더가 test/data존재한다고 가정하고 다음 명령을 실행했습니다 .

for file in $(aws s3 ls s3://foo-bucket | awk '{print $NF}'); do
    aws s3 cp foo-bucket/${file} test/data && tar -xzf test/data/${file} -C test/data/
done

이를 위해 관련 경로 아래의 모든 파일을 가져와서 추출합니다. 그러나 쉘을 통해 이와 똑같은 작업을 수행하는 경우:

/bin/bash -ac "for file in $(aws s3 ls s3://foo-bucket | awk '{print $NF}') ; do aws s3 cp foo-bucket/${file} test/data && tar -xzf test/data/${file} -C test/data/ ; done"

다음과 같은 이상한 오류가 발생합니다.

/bin/bash: -c: line 1: syntax error near unexpected token foo1.tar.gz'
/bin/bash: -c: line 1: foo1.tar.gz ; do aws s3 cp s3://foo-bucket/foo1.tar.gz  test/data' && tar -xzf 'test/data/foo1.tar.gz' -C 'test/data/' ; done'

왜 이런 일이 발생하는지 아시나요?

답변1

그들은 완전히 동일하지 않습니다! awk를 보세요.

 awk '{print $NF}'

다른 곳에는 당신이 있습니다

 bash -c " .... awk '{print $NF}' ..."

첫 번째 것에서는 $작은따옴표로 보호되므로 awk의 프로그램은 이지만 {print $NF}문자열을 구성할 때 두 번째 것의 작은따옴표는 의미가 없습니다. NFDefined라는 쉘 변수가 없다고 가정하면 후자는 다음을 제공합니다.

 bash -c " ... awk '{print }' ..."

따라서 awk는 명령의 모든 출력을 인쇄 aws하고 쉘은 구문 오류를 표시합니다.

$( ... ) 또한 잘못된 시간에 평가될 수 있습니다.

일반적으로 다음과 같은 경우가 아니면 항상 큰따옴표보다는 작은따옴표를 사용하십시오.생각하다평가할 변수입니다.

관련 정보