วิธีการทำซ้ำตัวแปรสองครั้งใน xargs


21

ฉันจะสร้างเสียงสะท้อนที่สองเพื่อสะท้อนการทดสอบในตัวอย่างนี้ได้อย่างไร:

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

var=test & echo $var ...
alexus

xargs -I {} var = {} echo $ var && echo $ var ที่จะให้คุณ: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

คำตอบ:


27

เพียงแค่เขียน{}สองครั้งในคำสั่งของคุณ ต่อไปนี้จะทำงาน:

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

ปัญหาของคุณคือวิธีการคำสั่งที่มีการซ้อนกัน ให้ดูที่นี้

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

ทุบตีecho test | xargs -I {} echo {}จะดำเนินการ หากทำงานได้สำเร็จecho {}จะดำเนินการ ในการเปลี่ยนรังคุณสามารถทำสิ่งนี้:

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

อย่างไรก็ตามคุณอาจได้รับปัญหาเพราะวิธีการอาจมีแนวโน้มที่จะฉีดรหัส เมื่อ "test" ถูกแทนที่ด้วยรหัสเชลล์มันจะถูกดำเนินการ ดังนั้นคุณควรส่งผ่านอินพุตไปยังเชลล์ที่อยู่ติดกันพร้อมอาร์กิวเมนต์

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

3
โปรดทราบว่าคุณจะได้รับผลที่ไม่คาดคิดในรหัสสุดท้ายของคุณหากคุณมี callod afile $(rm -f *)แท้จริง จะดีกว่าที่จะทำxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda

@ Kusalananda ขอบคุณ ฉันตระหนักถึงปัญหา แต่ฉันไม่สามารถนึกถึงวิธีแก้ปัญหาง่ายๆในขณะนั้น ฉันรวมข้อเสนอแนะของคุณเข้ากับคำตอบ
JojOatXGME

5

ตัวเลือกอื่นคือใช้-iแฟล็กซึ่งเหมือนกับ-I{}(หมายถึงการแทนที่ด้วย{}):

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

1
ในขณะเดียวกัน: ได้รับการเพิ่มคู่มือการใช้งานThis option is deprecated; use -I instead. man xargs
โจนาธานโค

0

สำหรับฉันเท่านั้นตัวพิมพ์เล็กทำงานได้ ฉันมีภาพหลายร้อยภาพในไดเรกทอรีและต้องการให้พวกมันมาเป็นรายการ -Iตัวเลือกตัวพิมพ์ใหญ่ฉันไม่ทำงานสำหรับฉัน เฉพาะตัวพิมพ์เล็ก อาจเป็นเพราะความแตกต่างของรุ่น ภาพเหล่านี้ล้วนมีชื่อเหมือนDaniel_(somenumber).jpgกัน

ไวยากรณ์นี้ใช้งานได้:

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

ผลตอบแทน:

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

Linux เวอร์ชั่น 4.14.96-hw + # 80 SMP x86_64 GNU / Linux


2
ฉันได้เพิ่มการจัดรูปแบบบางส่วนลงในคำตอบของคุณเพื่อให้อ่านง่ายขึ้น ฉันหวังว่าฉันจะเข้าใจมันอย่างถูกต้อง
fra-san
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.