เปลี่ยนเส้นทางไปยัง stdin แทนการโต้แย้งเมื่อใช้ xargs [ปิด]


12

สำหรับ exmaple ใช้คำสั่ง

cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"

foo.txtมีสองบรรทัด

foo
bar

คำสั่งข้างต้นพิมพ์อะไร

คำตอบ:


6
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh" 

ส่วนที่ยุ่งยากคือ xargs ทำการร้องขอ subshell โดยปริยาย ที่นี่จะเรียกอย่างชัดเจนและท่อจะไม่กลายเป็นส่วนหนึ่งของการลำเลียงหลัก


1
ขอบคุณฉันได้อัปเดตคำถามของฉันเพื่อให้เป็นตัวอย่างที่ชัดเจนยิ่งขึ้น แต่มันใช้งานไม่ได้ตามที่คุณแนะนำ ..
Ryan

1
echo ไม่สามารถอ่านจาก stdin ได้ดังนั้นการวางท่อในท่อจึงไม่มีความหมาย เปรียบเทียบสิ่งนี้cat foo.bar | wc -lและcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
Kondybas

1
ฉันคิดว่าคุณหมายถึง-Iแทนที่จะ-J; ไม่มี-Jตัวเลือกในการ xargs
Hitechcomputergeek

@Hitechcomputergeek เวอร์ชั่นของ FreeBSD xargsมี-Jตัวเลือกที่เทียบเท่ากับ-ilinuxxargs
Kondybas

@Kondybas ขอบคุณที่บอกฉันว่า; ฉันไม่ทราบว่ามีความแตกต่างระหว่างทั้งสอง คุณสามารถเชื่อถือ GNU ไม่ให้ทำตาม POSIX ฮ่า ๆ ( -Jไม่ได้กำหนดใน POSIX แต่-Iเป็นและมีการใช้งานที่แตกต่างจาก GNU)
Hitechcomputergeek

2

หากคุณต้องการประมวลผลทุกบรรทัดของ foo.txt คุณจะต้องใช้การวนซ้ำ ใช้&เพื่อทำให้กระบวนการเป็นพื้นหลัง

while read line; do
   echo $line | bar.sh &
done < foo.txt

หากอินพุตของคุณมีช่องว่างตั้งตัวคั่นฟิลด์ภายในเป็นบรรทัดใหม่ชั่วคราว

# save the field separator
OLD_IFS=$IFS

# new field separator, the end of line 
IFS=$'\n'

for line in $(cat foo.txt) ; do
   echo $line | bar.sh &
done

# restore default field separator  
IFS=$OLD_IFS     

ไม่ไม่ฉันก็ติดอยู่เหมือนกัน TS ต้องการแบ่งไฟล์ออกเป็นบรรทัดที่แยกจากกันและป้อนลงในสคริปต์อย่างอิสระ
Kondybas

1
ฉันต้องใช้ xargs คู่ขนานกับกระบวนการ ..
ไรอัน

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