할 때 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}
문자열을 구성할 때 두 번째 것의 작은따옴표는 의미가 없습니다. NF
Defined라는 쉘 변수가 없다고 가정하면 후자는 다음을 제공합니다.
bash -c " ... awk '{print }' ..."
따라서 awk는 명령의 모든 출력을 인쇄 aws
하고 쉘은 구문 오류를 표시합니다.
$( ... ) 또한 잘못된 시간에 평가될 수 있습니다.
일반적으로 다음과 같은 경우가 아니면 항상 큰따옴표보다는 작은따옴표를 사용하십시오.생각하다평가할 변수입니다.