จำนวน agruments ที่ยืดหยุ่นด้วย xargs


0

เป็นไปได้หรือไม่ที่จะระบุจำนวนอาร์กิวเมนต์ที่xargsใช้โดยไม่ทำอย่างชัดเจนด้วย-nตัวเลือก แต่โดยปริยายด้วยตัวคั่นดังนั้นพารามิเตอร์เดียวจะถูกคั่นด้วยช่องว่าง แต่กลุ่มของอาร์กิวเมนต์ที่ xargs ใช้ในครั้งเดียวจะถูกคั่นด้วย เช่น'\n'?

ฉันต้องการส่งพารามิเตอร์จำนวนยืดหยุ่นให้กับสคริปต์: พารามิเตอร์เหล่านั้นถูกเก็บไว้ในรายการดังนี้:

param1 param2
param1 param2 param3
param1

ควรเป็นไปได้ที่จะส่งพารามิเตอร์หนึ่งบรรทัดต่อครั้งไปยังสคริปต์ ฉันไม่ต้องการใช้สคริปต์พร็อกซีใด ๆ และไม่ต้องการเขียนรายการไฟล์หรือคำสั่งชั่วคราวลงดิสก์ ฉันต้องการอ่านพารามิเตอร์จากไฟล์ปรับเปลี่ยน "on the fly" (เช่นลบทุกบรรทัดอื่น ๆ ) และเปลี่ยนเส้นทางด้วย xargs ไปยังสคริปต์ปลายทาง

สิ่งที่ฉันพยายามคือใช้'\n'เป็นตัวคั่นอาร์กิวเมนต์ แต่กว่า params ทั้งหมดในบรรทัดจะถูกตีความว่าเป็นอาร์กิวเมนต์เดียวแม้ว่าจะคั่นด้วยช่องว่าง


Hardcoding การเรียกใช้โปรแกรมหรือเรียกสคริปต์ที่คาดว่าจะมีข้อโต้แย้ง 6 ข้อและแยกออกเป็นสามสายนี้ไม่ใช่ตัวเลือกใช่ไหม
Daniel Beck

ไม่นี่เป็นเพียงตัวอย่างรายการสามารถมีความยาวได้ นอกจากนี้ฉันไม่ต้องการทำเช่นนี้ด้วยสคริปต์พร็อกซีที่แยกอาร์กิวเมนต์ที่คั่นด้วยช่องว่าง
crenate

คำตอบ:


0

Q

ต้องการฉันต้องการบรรลุคือการส่งรายการต่อไปนี้ผ่าน xargs แต่ทีละบรรทัด:

A

$ cat t7.txt
param1 param2
param1 param2 param3
param1

$ cat t7.sh
#!/bin/bash
cat t7.txt | while read line
do
  echo $line | xargs echo XXX
done

$ ./t7.sh
XXX param1 param2
XXX param1 param2 param3
XXX param1

แต่มีวิธีที่ง่ายกว่าเพื่อให้ได้ผลลัพธ์นี้โดยไม่ต้องใช้ xargs ดังนั้นคุณอาจต้องการชี้แจงคำถามของคุณ


ปรับปรุง

$ while read line; do echo "< $line >"; done
p1 p2
< p1 p2 >
p1
< p1 >
p1 p2 p3
< p1 p2 p3 >

ฉันไม่คิดว่า xargs คือคำตอบสำหรับงานของคุณ ฉันสงสัยว่าคุณน่าจะใช้สคริปต์แทน xargs ดีกว่า


ขอบคุณ แต่ฉันไม่ต้องการเขียนไฟล์ระดับกลาง ฉันแก้ไขคำถามเพื่อชี้แจง ฉันต้องการทำสิ่งนี้ "ในทันที"
crenate

@mithy: คำตอบอัพเดทตาม
RedGrittyBrick

ใช่คุณพูดถูกห่วงก็ทำตามที่ฉันต้องการ ขอบคุณ!
crenate

1

ด้วย GNU Parallel คุณสามารถทำได้:

cat yourfile | parallel -q bash -c 'echo {}'

หากเป็นที่ยอมรับว่าพารามิเตอร์เข้าร่วมเป็นหนึ่งเดียวคุณสามารถทำได้:

cat yourfile | parallel echo {}

คุณสามารถติดตั้ง GNU Parallel ได้ง่ายๆโดย:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

ดูวิดีโอแนะนำสำหรับ GNU Parallel เพื่อเรียนรู้เพิ่มเติม: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

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