Spróbuj:
printf %b 'ac s\nbc s\ncc s\n' | xargs -d '\n' bash /tmp/test.sh
Ty zaniedbane zacytować \n
przekazany do -d
, co oznacza, że tylko n
zamiast \n
został przekazany do xargs
jako ogranicznik - skorupa "zjadł" THE \
(gdy powłoka analizuje niecytowany ciąg znaków, \
działa jako znak escape, a jeśli zwykła postać podąża za \
- n
w tym przypadku - używany jest tylko ten zwykły znak).
Zwróć także uwagę na zalecenie @glenn jackman, aby dwukrotnie zacytować [email protected]
w skrypcie (lub całkowicie pomiń część in "[email protected]"
).
Również: xargs -d
to rozszerzenie GNU, które na przykład nie działa w FreeBSD/macOS. Aby to działało, zobacz rozwiązanie oparte na @glenn jackman's xargs -0
.
Zauważ, że używam printf
zamiast echo
aby upewnić się, że \n
przypadki w ciągu są interpretowane jako nowymi liniami w wszystkie Bourne'a jak muszle:
W bash
i ksh
[1] , echo
domyślnie NIE interpretuje \
-sekwencji ucieczki (musisz użyć -e
, aby to osiągnąć) - w przeciwieństwie do zsh
i ściśle zgodnych z POSIX-ami powłok, takich jak dash
.
Dlatego też bardziej przenośny wybór to printf
.
[1] zgodnie z podręcznikiem ksh
jest echo
wbudowane wykazuje takie samo zachowanie jak zewnętrznego echo
narzędzie platformy przyjmującej; chociaż może się to różnić w zależności od platformy, implementacje Linuksa i BSD/OSX domyślnie interpretują sekwencje specjalne.
Dobra rada, choć prawdziwy problem leży nie cytując '\ n' przekazano do' -d'. – mklement0
To osobny numer, ale dzięki za wskazanie. –
Masz całkowitą rację: _obowiązuje wiele problemów, aby rozwiązać problem (i każdy z nich w izolacji lub w połączeniu wytwarza symptomy). Twoje rozwiązanie 'printf' -' \ 0' -'xargs -0' jest dobrą alternatywą, ponieważ jest bardziej przenośne (będzie działać również na OSX, na przykład, gdy' xargs -d' nie jest dostępny). – mklement0