Odpowiedzi:
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh"
Chodzi o to, że xargs wykonuje niejawne wywołanie podpowłoki. Wywołano tutaj jawnie, a rura nie staje się częścią przenośnika macierzystego
cat foo.bar | wc -l
icat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
-I
zamiast -J
; -J
xargs nie ma opcji
xargs
ma -J
opcję, która jest odpowiednikiem -i
linuksaxargs
-J
nie jest zdefiniowany w POSIX, ale -I
jest i ma inne zastosowanie niż GNU.)
Jeśli chcesz przetworzyć wszystkie linie foo.txt, będziesz musiał użyć pętli. Użyj, &
aby umieścić proces w tle
while read line; do
echo $line | bar.sh &
done < foo.txt
Jeśli dane wejściowe zawierają spacje, tymczasowo ustaw wewnętrzny separator pól na nowy wiersz
# save the field separator
OLD_IFS=$IFS
# new field separator, the end of line
IFS=$'\n'
for line in $(cat foo.txt) ; do
echo $line | bar.sh &
done
# restore default field separator
IFS=$OLD_IFS
xargs
użytego OP.