Ejecutar el comando en el shell del contenedor sin procesar frente al comando usando /bin/bash -ac, obteniendo resultados diferentes

Ejecutar el comando en el shell del contenedor sin procesar frente al comando usando /bin/bash -ac, obteniendo resultados diferentes

Al hacer docker exec -it [container_id] /bin/bash:

Ejecuté lo siguiente:
Supongamos que la carpeta test/dataexiste.

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

Para esto, obtengo todos los archivos en la ruta correspondiente y los extraigo. Sin embargo, al hacer exactamente lo mismo a través de Shell de esta manera:

/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"

Recibo un error extraño como:

/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'

¿Alguna idea de por qué sucede?

Respuesta1

¡No son exactamente iguales! Mira el awk, en uno tienes

 awk '{print $NF}'

y en el otro tienes

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

En el primero, $está protegido por comillas simples, por lo que el programa para awk es {print $NF}, pero las comillas simples no tienen significado en el segundo mientras se construye la cadena. Suponiendo que no tiene una variable de shell llamada NFdefinida, esta última proporciona

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

entonces awk imprime toda la salida de su awscomando y el shell le muestra errores de sintaxis.

Probablemente el $( ... ) también se esté evaluando en el momento equivocado.

En general, utilice siempre comillas simples en lugar de comillas dobles, a menos quedesearvariables a evaluar.

información relacionada