Câu trả lời:
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 {}
$(rm -f *)
. Tốt hơn nên làmxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Một tùy chọn khác là sử dụng -i
cờ, giống như -I{}
(nó ngụ ý rằng sự thay thế được đưa ra với {}
):
$ echo test | xargs -i echo {} {}
This option is deprecated; use -I instead.
đã được thêm vào hướng dẫn man xargs
.
Đố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 -I
tù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
var=test & echo $var ...