컨테이너 셸 원시에서 명령 실행 및 /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}' ..."

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

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

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

$( ... ) 도 잘못된 시간에 평가되고 있을 수 있습니다.

일반적으로 다음과 같은 경우를 제외하고는 항상 큰따옴표보다는 작은따옴표를 사용하십시오.원하다평가할 변수.

관련 정보