Risposte:
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh"
La parte complicata è che xargs esegue una chiamata implicita alla subshell. Qui viene invocato esplicitamente e pipe non diventa la parte del trasportatore padre
cat foo.bar | wc -l
ecat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
-I
invece di -J
; non c'è alcuna -J
opzione per xargs
xargs
ha -J
un'opzione equivalente a quella -i
di Linuxxargs
-J
non è definito in POSIX ma lo -I
è e ha un uso diverso da quello di GNU.)
Se vuoi elaborare tutte le righe di foo.txt dovrai usare un loop. Utilizzare &
per mettere il processo in background
while read line; do
echo $line | bar.sh &
done < foo.txt
Se l'input contiene spazi, imposta temporaneamente il separatore di campo interno sulla nuova riga
# 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
dell'OP utilizzato.