Chuyển hướng đến stdin thay vì đối số khi sử dụng xargs [đã đóng]


12

cho exmaple, sử dụng lệnh

cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"

foo.txthai dòng

foo
bar

Lệnh trên không in gì cả.

Câu trả lời:


6
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ẹ


1
Cảm ơn, tôi đã cập nhật câu hỏi của mình để cung cấp một ví dụ cụ thể hơn. nhưng nó không hoạt động như bạn đề xuất ..
Ryan

1
echo không thể đọc từ stdin, vì vậy đường ống đến nó không có ý nghĩa. so sánh điều này: cat foo.bar | wc -lcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
Kondybas

1
Tôi nghĩ bạn có nghĩa là -Ithay vì -J; không có -Jtùy chọn để xargs
Hitechcomputergeek

Phiên bản @Hitechcomputergeek FreeBSD của xargs-Jtùy chọn đó là tương đương với -icủa Linuxxargs
Kondybas

@Kondybas Cảm ơn bạn đã nói với tôi rằng; Tôi đã không nhận ra rằng có một sự khác biệt giữa hai. Bạn có thể tin tưởng GNU để không theo dõi POSIX lol. ( -Jkhông được xác định trong POSIX nhưng -Icó và có cách sử dụng khác với GNU.)
Hitechcomputergeek

2

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     

Không - không, tôi cũng bị mắc kẹt với nó. TS muốn chia tệp thành các dòng riêng biệt và đưa chúng vào tập lệnh một cách độc lập
Kondybas

1
Tôi cần sử dụng xargs để song song quá trình ..
Ryan

OK :-) Tôi chỉ cần tra cứu các tùy chọn của xargsOP được sử dụng.
Matteo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.