Ausführen des Befehls in der Container-Shell im Rohzustand gegenüber dem Befehl mit /bin/bash -ac führt zu unterschiedlichen Ergebnissen

Ausführen des Befehls in der Container-Shell im Rohzustand gegenüber dem Befehl mit /bin/bash -ac führt zu unterschiedlichen Ergebnissen

Wenn Sie Folgendes tun docker exec -it [container_id] /bin/bash:

Ich habe Folgendes ausgeführt:
Gehen Sie davon aus, dass der Ordner test/datavorhanden ist.

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

Dazu hole ich mir alle Dateien unter dem entsprechenden Pfad und entpacke sie. Dasselbe mache ich aber auch über die Shell und zwar so:

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

Ich erhalte seltsame Fehler wie:

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

Irgendeine Idee, warum das passiert?

Antwort1

Sie sind nicht genau gleich! Schau dir das awk an, in einem hast du

 awk '{print $NF}'

und in der anderen haben Sie

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

Im ersten $ist das durch einfache Anführungszeichen geschützt, sodass das Programm für awk lautet {print $NF}, aber im zweiten haben die einfachen Anführungszeichen keine Bedeutung, während der String erstellt wird. Vorausgesetzt, Sie haben keine Shell-Variable namens NFdefiniert, ergibt das letztere

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

daher druckt awk die gesamte Ausgabe Ihres awsBefehls und die Shell gibt Syntaxfehler aus.

Wahrscheinlich wird $( ... ) auch zum falschen Zeitpunkt ausgewertet.

Verwenden Sie grundsätzlich immer einfache Anführungszeichen statt doppelter Anführungszeichen, es sei denn Siewollenauszuwertende Variablen.

verwandte Informationen