วิธีรันคำสั่งซ้ำ ๆ ด้วยอาร์กิวเมนต์ที่ต่างกัน?


11

ฉันใช้ Ubuntu ฉันคัดลอกบางอาร์กิวเมนต์ (คั่นด้วย newline) และฉันสามารถใช้xselเพื่อพิมพ์ออกมาเช่นนี้

$ xsel
arg1
arg2
arg3
arg4
...

ตอนนี้ฉันต้องการใช้แต่ละอาร์กิวเมนต์เหล่านี้สำหรับคำสั่งอื่นและดำเนินการคำสั่งนั้นหลายครั้งตามที่มีข้อโต้แย้ง

ดังนั้นฉันจึงพยายาม

$ xsel | mycommand "constantArgument" $1

อย่างไรก็ตามสิ่งนี้ดำเนินการmycommandสำหรับอาร์กิวเมนต์แรกเท่านั้น ฉันจะรันมันสำหรับทุก ๆ การโต้แย้งได้อย่างไร?


แก้ไขคำถามเพื่อสะท้อนความจริงที่ว่ามีมากกว่าหนึ่งอาร์กิวเมนต์ในคำสั่งของฉัน
Wes

คำตอบ:


12

คุณสามารถใช้ xargs

xsel | xargs -n1 echo mycommand 

-n1 หมายถึงหนึ่ง arg สำหรับคำสั่งของฉัน แต่มันเป็นเพียงการทำงานแบบแห้งมันจะแสดงสิ่งที่จะถูกเรียกใช้เพื่อเรียกใช้มันออก echo

สำหรับอาร์กิวเมนต์คงที่

xsel | xargs -I {} -n1 echo mycommand "constantArgument" {}

จะเกิดอะไรขึ้นถ้า "คำสั่ง" คาดว่าจะมีอาร์กิวเมนต์มากกว่าหนึ่งตัวที่ xsel มีเพียงอาร์กิวเมนต์เดียว?
Wes

xsel | xargs -n1 echo mycommand -more-arg
ราหุลปาติล

xsel | xargs -n2 echo mycommandARG สองตัวต่อคำสั่ง
Rahul Patil

7
xsel | while read line; do mycommand "$line"; done

หรือสิ่งที่คล้ายกัน คุณสามารถใช้xargsซึ่งเป็นคำสั่งที่มีประสิทธิภาพมากสำหรับการจัดการกับอาร์กิวเมนต์บรรทัดคำสั่ง


1

สำหรับการปรับแต่งเล็กน้อย:

printf "${CMD} %s ${ARG2}\n" `xsel` | sh -n

คุณสามารถลบการ-noexecuteตั้งค่าสถานะหลังจากที่คุณเห็นวิธีการทำงาน

หากมันเหมาะกับคุณคุณสามารถทิ้งshทั้งหมดแล้วทำสิ่งนี้แทน:

. <<HERE /dev/stdin
    $(printf "${CMD} %s ${ARG2}\n" `xsel`)
HERE

หรือเร็วกว่า:

printf "${CMD} %s ${ARG2}\n" `xsel` | . /dev/stdin

ทั้งสองวิธีนั้นง่ายและจะทำ

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