Cách lặp lại biến hai lần trong xargs


21

Làm thế nào tôi có thể tạo ra tiếng vang thứ hai để lặp lại thử nghiệm trong ví dụ này:

 echo test  | xargs -I {} echo {} && echo {}
xargs 

var=test & echo $var ...
alexus

xargs -I {} var = {} echo $ var && echo $ var Điều đó sẽ cung cấp cho bạn: Không có tệp hoặc thư mục như vậy.

Câu trả lời:


27

Chỉ cần viết {}hai lần trong lệnh của bạn. Sau đây sẽ làm việc:

$ echo test | xargs -I {} echo {} {}
test test

Vấn đề của bạn là làm thế nào các lệnh được lồng nhau . Hãy nhìn vào điều này:

echo test | xargs -I {} echo {} && echo {}

Bash sẽ thực thi echo test | xargs -I {} echo {}. Nếu nó chạy thành công, echo {}được thực thi. Để thay đổi lồng nhau, bạn có thể làm một cái gì đó như thế này:

echo test | xargs -I {} sh -c "echo {} && echo {}"

Tuy nhiên, bạn có thể gặp rắc rối vì cách tiếp cận có thể dễ bị tiêm mã. Khi "test" được thay thế bằng mã shell, nó sẽ được thực thi. Do đó, có lẽ bạn nên chuyển đầu vào vào shell lồng với các đối số.

echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}

3
Lưu ý rằng bạn sẽ nhận được kết quả bất ngờ trong mã cuối cùng của mình nếu bạn có callod xa, theo nghĩa đen , $(rm -f *). Tốt hơn nên làmxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda

@Kusalananda, cảm ơn. Tôi đã nhận thức được vấn đề nhưng tôi không thể nghĩ ra một giải pháp đơn giản tại thời điểm đó. Tôi tích hợp đề nghị của bạn vào câu trả lời.
JojOatXGME

5

Một tùy chọn khác là sử dụng -icờ, giống như -I{}(nó ngụ ý rằng sự thay thế được đưa ra với {}):

$ echo test | xargs -i echo {} {}

1
Trong khi đó: This option is deprecated; use -I instead.đã được thêm vào hướng dẫn man xargs.
Jonathan Komar

0

Đối với tôi chỉ có các trường hợp thấp hơn làm việc. Tôi đã có hàng trăm hình ảnh trong một thư mục và muốn đưa chúng vào danh sách. Trường hợp trên tôi -Itùy chọn không làm việc cho tôi. Chỉ có chữ thường. Có lẽ là do sự khác biệt về phiên bản. Những hình ảnh này đều có tên như thế Daniel_(somenumber).jpg.

Cú pháp này đã hoạt động:

ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"

Trả về:

src='Daniel_248.jpg' alt='Daniel_248.jpg'
...

Linux ver 4.14.96-hw + # 80 SMP x86_64 GNU / Linux


2
Tôi đã thêm một số định dạng vào câu trả lời của bạn để làm cho nó dễ đọc hơn. Tôi hy vọng tôi đã hiểu chính xác nó.
fra-san
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.