
Al hacer docker exec -it [container_id] /bin/bash
:
Ejecuté lo siguiente:
Supongamos que la carpeta test/data
existe.
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 NF
definida, esta última proporciona
bash -c " ... awk '{print }' ..."
entonces awk imprime toda la salida de su aws
comando 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.