Versuchen:
printf %b 'ac s\nbc s\ncc s\n' | xargs -d '\n' bash /tmp/test.sh
Sie vernachlässigt die \n
--d
weitergegeben zu zitieren, was bedeutet, dass nur n
anstatt \n
-xargs
als Trennzeichen übergeben wurde - die Schale „aß“ die \
(wenn Die Shell analysiert eine nicht angeführte Zeichenkette, \
fungiert als Escape-Zeichen, wenn in diesem Fall ein normales Zeichen dem \
- n
folgt - wird nur dieses gewöhnliche Zeichen verwendet.
Beachten Sie auch @ glenn Jackman's Tipp, die [email protected]
innerhalb des Skripts double-quote (oder lassen Sie die in "[email protected]"
Teil insgesamt).
Auch: xargs -d
ist eine GNU-Erweiterung, die zum Beispiel nicht auf FreeBSD/macOS funktioniert. Um es dort funktionieren zu lassen, sehen Sie sich @ glenn jackmans xargs -0
-basierte Lösung an.
Bitte beachte, dass ich printf
bin mit eher als echo
, um sicherzustellen, dass die \n
Instanzen in der Zeichenfolge werden als neue Zeilen interpretieren in alle Bourne-wie Muscheln:
In bash
und ksh
[1]echo
standardmäßig \
-basierte Escape-Sequenzen nicht interpretieren (Sie müssen -e
verwenden, um dies zu erreichen) - im Gegensatz zu zsh
und streng POSIX-konforme Shells wie dash
.
Daher ist printf
die tragbare Wahl.
[1] Laut Handbuch, ksh
‚s echo
builtin zeigt das gleiche Verhalten wie die externe echo
Dienstprogramm der Host-Plattform; Während dies von Plattform zu Plattform unterschiedlich sein kann, interpretieren die Linux- und BSD/OSX-Implementierungen nicht standardmäßig \
Escape-Sequenzen.
Guten Rat verwenden, obwohl das eigentliche Problem liegt bei nicht zitieren '\ n' wurde an' -d' übergeben. – mklement0
Das ist ein separates Problem, aber danke, dass Sie darauf hingewiesen haben. –
Sie haben absolut Recht: _both_ Probleme müssen behoben werden, um das Problem zu beheben (und sie jeweils in Isolation oder Kombination das Symptom erzeugen). Ihre 'printf'-' \ 0'-'xargs -0' Lösung ist eine nette Alternative, da sie portabler ist (wird auch unter OSX funktionieren, wo 'xargs -d' nicht verfügbar ist). – mklement0