Làm thế nào tôi có thể làm cho xargs chơi tốt với stdin?


7
$ seq 1 3
1
2
3
$ seq 1 3 | xargs echo
1 2 3
$

Thay thế seq 1 3bằng bất kỳ lệnh nào liệt kê các mục nhập một dòng trên tiêu chuẩn. Làm cách nào tôi có thể nhận được nhiều hơn hoặc ít hơn những gì bạn mong đợi, tức là các mục trên các dòng riêng biệt ( echo 1; echo 2; echo 3;)?


Thường xargskhông phải là lệnh bạn cần. Bạn đang sử dụng hai lệnh bên ngoài seqtương ứng xargsđể đạt được thứ gì đó mà trình bao của bạn có thể tự thực hiện. Lấy ví dụ mở rộng Brace trong bash. Sau đó, bạn có thể phát hành printf '%s\n' {1..10} để có được kết quả mong muốn
Valentin Bajrami

@ val0x00ff Trường hợp sử dụng thực tế của tôi đang triển khai một Brewfilehomebrew trong tập lệnh bootstrap của riêng tôi . Tôi không chắc mình có thể sử dụng bất kỳ tính năng nào của vỏ để thực hiện công việc.
Sean Allred

Chức năng bạn có ở đó nocommentonelinecó thể được kết hợp thành một chức năng nocomment_oneline và đặtsed '/^#/d;/^.$/d' "$1" | sed -e :a -e '$!N;s/\n/ /;ta'
Valentin Bajrami

@ val0x00ff Có, nhưng sau đó tôi thực sự không thể sử dụng nó.
Sean Allred

Tôi không chắc tại sao bạn sẽ không thể? Điều đó chỉ kết hợp cả hai chức năng. Bạn đang sử dụng một chức năng để lọc ra các bình luận và các dòng trống. Sau đó, bạn đang đọc tệp và đặt tất cả các dòng trong một.
Valentin Bajrami

Câu trả lời:


15

Thông thường xargssẽ đặt một số đối số trên một dòng lệnh. Để giới hạn nó ở một đối số tại một thời điểm, hãy sử dụng -ntùy chọn:

$ seq 3 | xargs -n 1 echo
1
2
3

Tài liệu

Từ man xargs:

-n max-args
Sử dụng tối đa các đối số max-args trên mỗi dòng lệnh. Ít hơn các đối số max-args sẽ được sử dụng nếu kích thước (xem tùy chọn -s) bị vượt quá, trừ khi tùy chọn -x được đưa ra, trong trường hợp đó xargs sẽ thoát.

Sự khác biệt giữa -n-L

-Llà tương tự nhưng có một tính năng bổ sung: không giống như -n, các dòng có khoảng trống được tiếp tục trên dòng tiếp theo. Quan sát:

$ echo $'1 \n2\n3\n4'
1 
2
3
4
$ echo $'1 \n2\n3\n4' | xargs -L 1 echo
1 2
3
4
$ echo $'1 \n2\n3\n4' | xargs -n 1 echo
1
2
3
4

Tôi tự hỏi: làm thế nào -n-Lkhác nhau về trường hợp sử dụng? Chắc chắn họ phải khác bên ngoài ví dụ tầm thường này.
Sean Allred

@SeanAllred -Lkhác biệt ở chỗ nó có một tính năng trống. Tôi chỉ thêm một ví dụ minh họa nó. (Câu trả lời của bạn có +1 của tôi)
John1024

1
Tôi nghĩ Sean có nghĩa là, khi nào bạn sẽ sử dụng xargs -L? Khi nào tính năng khoảng trống hữu ích?
Tor Klingberg

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.