xargs trennen bei Zeilenumbruch keine Leerzeichen
hier ist mein problem in kurzen
$ echo 'for i in $@; do echo arg: $i; done; echo DONE' > /tmp/test.sh
$ echo "ac\nbc\ncc\n" | xargs bash /tmp/test.sh
arg: ac
arg: bc
arg: cc
DONE
Das ist, was ich erwarte, aber
$ echo "ac s\nbc s\ncc s\n" | xargs -d \n bash /tmp/test.sh
arg: ac
arg: s
arg: bc
arg: s
arg: cc
arg: s
DONE
Sollte nicht die Ausgabe sein?
arg: ac s
arg: bc s
arg: cc s
DONE
Wie bekomme ich die 2. Ausgabe mit xargs?
InformationsquelleAutor fakedrake | 2014-04-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen:
, Die Sie vernachlässigt zu zitieren, die
\n
übergeben-d
, was bedeutet, dass nurn
eher als\n
übergebenxargs
als Trennzeichen - die shell "ate" die\
(wenn die shell analysiert eine unquoted string\
Funktionen als ein escape-Zeichen; wenn ein gewöhnlicher Charakter folgt die\
-n
in diesem Fall - nur das gewöhnliche Zeichen verwendet wird).Auch beherzigen @glenn jackman Beratung der double-quote der
$@
im script (oder weglassenin "$@"
Teil zusammen).Auch:
xargs -d
ist eine GNU-Erweiterung, die, zum Beispiel, wird nicht funktionieren auf FreeBSD/macOS. Damit es funktioniert, siehe @glenn jackman istxargs -0
-basierte Lösung.Hinweis, dass ich mit
printf
eher alsecho
um sicherzustellen, dass die\n
Instanzen im string interpretiert werden als neue Zeilen in alle Bourne-shells:In
bash
undksh
[1],echo
standardmäßig NICHT interpretieren\
-basierten escape-Sequenzen (-e
zu erreichen) - anders als inzsh
und streng-POSIX-konformen shells wiedash
.Daher
printf
ist, desto mehr tragbare Wahl.[1] Laut Handbuch
ksh
'secho
builtin zeigt das gleiche Verhalten wie die host-Plattform mit der externenecho
utility; während diese variieren in den verschiedenen Plattformen, die Linux und BSD/macOS Implementierungen nicht interpretieren\
escape-Sequenzen standardmäßig.InformationsquelleAutor mklement0
Ihre shell-Skript muss
"$@"
nicht$@
Sehen http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters
Sehe ich in der xargs-Handbuch auf meinem Rechner:
(Hervorhebung von mir)
Also:
Mit der ehemaligen, erhalten Sie den Gegenwert von
Vergleich mit null-separator
Müssen Sie klar sein, was das Trennzeichen ist mit xargs, wenn die Daten enthält Leerzeichen.
Beachten Sie das zusätzliche arg-im letzten Fall
echo
schon fügt einen Zeilenumbruch, so brauchen Sie nicht extra ein, es sei denn, Sie verwendenecho -n
\n
übergeben-d
.Das ist ein separates Problem, aber danke für den Hinweis it out.
Du hast absolut Recht: beide Fragen, die angegangen werden müssen, um das problem zu beheben (und Sie jeweils allein oder in Kombination erzeugen das symptom). Ihre
printf
-\0
-xargs -0
Lösung ist eine gute alternative, denn es ist mehr tragbar (auf OSX auch, zum Beispiel, woxargs -d
ist nicht verfügbar).InformationsquelleAutor glenn jackman