Tại sao xargs bỏ qua đối số đầu tiên khi chuyển sang subshell?


8

Tìm kiếm một cách để gọi nhiều hơn một lệnh trong xargs one-liner, tôi đã tìm thấy đề xuất trong findutils để gọi shell từ xargs như thế này:

$ find ... | xargs sh -c 'command $@'

Điều buồn cười là, nếu tôi sử dụng xargs như thế, vì một số lý do, nó bỏ qua đối số đầu tiên:

$ seq 10 | xargs bash -c 'echo $@'
2 3 4 5 6 7 8 9 10
$ seq 10 | xargs -n2 bash -c 'echo $@'
2
4
6
8
10

Có gì đó không ổn với phiên bản shell hoặc xargs của tôi? Là tài liệu đó không chính xác?

Sử dụng xargs (GNU findutils) 4.4.2GNU bash, phiên bản 4.3.11 (1) -release .

Câu trả lời:


13

Trang man [bash] cho biết: " -c stringNếu có tùy chọn -c, thì các lệnh được đọc từ chuỗi. Nếu có các đối số sau chuỗi, chúng được gán cho các tham số vị trí, bắt đầu bằng $ 0. " - Khóa là $ 0 ; nó có nghĩa là tên lệnh sẽ là đối số đầu tiên.

seq 10 | xargs sh -c 'echo $@; echo $0' sh
1 2 3 4 5 6 7 8 9 10
sh

ồ, tôi hiểu rồi Vì vậy, đó là lý do tại sao các tài liệu đưa nó movevào cuối ví dụ! Tôi nên đọc kỹ hơn ... Cảm ơn bạn! =)
elias

11

Tại sao xargs bỏ qua đối số đầu tiên khi chuyển sang subshell?

Nó không. Bash gán đối số đầu tiên cho $ 0:

$ seq 10 | xargs -n2 bash -c 'echo $0'
1
3
5
7
9

$@mở rộng đến $1 $2 $3.... Do đó, giá trị của $0không được bao gồm trong $@.


Giải thích này rõ ràng hơn nhiều so với @ Janis, nhưng câu trả lời của Janis bao gồm một giải pháp tốt cho vấn đề.
alexis
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.