Lassen Sie uns Ihre in Ihrem Verzeichnis das Vorhandensein der Dateien übernehmen 1.a
, 2.a
, 3.a
.
Mit dem Befehl
ls *.a | xargs -I{} echo {} | sed 's/.a//'
Sie haben keine Subshells, die Ausgabe von ls
wird in xargs
die Pipes geleitet, die ihre Ersetzungen vornehmen. Dann wird die Ausgabe zu Pipe geleitet sed
. Von hier aus dein erstes Ergebnis.
Mit dem Befehl
ls *.a | xargs -I{} bash -c "echo {} $(echo {} | sed 's/.a//')"
Du hast ein neues Element $(echo {} | sed 's/.a//')
.
Es wird erweitert und wird
echo {} # -- > {} echo {} | sed 's/.a//' # -- > {} again the same.
So kann Ihr Befehl als neu geschrieben werden
ls *.a | xargs -I{} bash -c "echo {} {} "
das gibt deine zweite Ausgabe.
Wie eben eben auch Gast in seinem Kommentar debuggen Sie Ihr Skript [ 1 ] (oder Kommando); mit set -x
Ihnen die Debug in der aktuellen Shell oder Script aktivieren und mit set +x
Ihnen deaktivieren:
set -x ls *.a | xargs -I{} bash -c "echo {} $(echo {} | sed 's/.a//')" set +x
und du wirst jeden Schritt sehen
+ ls --color=auto 1.a 2.a 3.a ++ echo '{}' ++ sed s/.a// + xargs '-I{}' bash -c 'echo {} {}' 1.a 1.a 2.a 2.a 3.a 3.a