Câu trả lời:
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh"
Phần khó khăn là xargs thực hiện việc gọi hàm ngầm. Ở đây sh gọi một cách rõ ràng và đường ống không trở thành một phần của băng tải mẹ
cat foo.bar | wc -l
vàcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
-I
thay vì -J
; không có -J
tùy chọn để xargs
xargs
có -J
tùy chọn đó là tương đương với -i
của Linuxxargs
-J
không được xác định trong POSIX nhưng -I
có và có cách sử dụng khác với GNU.)
Nếu bạn muốn xử lý tất cả các dòng của foo.txt, bạn sẽ phải sử dụng một vòng lặp. Sử dụng &
để đặt quá trình vào nền
while read line; do
echo $line | bar.sh &
done < foo.txt
Nếu đầu vào của bạn chứa khoảng trắng tạm thời đặt dấu tách trường bên trong thành dòng mới
# 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
OP được sử dụng.