รันคำสั่งเดียวกันอีกครั้งโดยใช้พารามิเตอร์อื่น


13

ฉันรู้ว่าฉันสามารถเรียกใช้คำสั่งต่อไปนี้

ls Some{File,Folder}

และมันก็เทียบเท่ากับการรันสิ่งนี้:

ls SomeFile SomeFolder

(ฉันยังใช้มันเพื่อสิ่งต่าง ๆ เช่นmv place_{a,b})

อย่างไรก็ตามฉันสงสัยว่ามีทางลัดอื่นที่ฉันสามารถทำสิ่งนี้:

run-command --a --whole --lot --of --flags parameter a; \
     run-command --a --whole --lot --of --flags parameter b

และฉันต้องพิมพ์run-command --a --whole --lot --of --flags parameter {a,b}หรืออะไรที่คล้ายกัน


ขึ้นอยู่กับrun-commandคำสั่ง Unix จำนวนมากที่จัดการกับอาร์กิวเมนต์ไฟล์หลายไฟล์ตามลำดับ
vonbrand

คำตอบ:


13

สมมติว่าคุณกำลังใช้ GNU bashหรืออะไรที่คล้ายกัน:

อาจจะเป็นforวง?

for x in a b
do
    run-command --a --whole --lot --of --flags parameter $x
done

ซึ่งสามารถเขียนได้ในหนึ่งบรรทัดเช่นกัน for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done


1
หรือถ้าคุณมีจำนวนมากที่คุณต้องการเรียกใช้คุณสามารถใช้การขยาย bash เช่นนี้ได้for x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
h3rrmiller

สิ่งที่เกิดขึ้นอาจเป็นรายการที่คั่นด้วยช่องว่างที่สร้างขึ้นได้หลายวิธี เพื่อใช่{a..z}, *.pdf, $(find ...)...
njsg

ฉันไม่รู้ว่าทำไมใจของฉันไม่กระโดดไปลูป ขอบคุณ! นี่อาจเป็นสิ่งที่ฉันใช้ แนวคิดของฟังก์ชั่นดี แต่ฉันชอบสิ่งนี้ดีกว่า
ashays

1
หนึ่งซับใช้งานได้เฉพาะกับฉันหลังจากลบคำหลัก;ต่อไปนี้ do
jimp

@jimp ขอบคุณฉันได้เปลี่ยนรหัสเพื่อลบ;มัน
njsg

5

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

xargs จะรับเนื้อหาจำนวนมากจากอินพุตมาตรฐานและใช้เป็นอาร์กิวเมนต์สำหรับคำสั่งเรียกใช้คำสั่งนั้นหลายครั้งหากจำเป็น

ลองทำสิ่งต่อไปนี้:

echo parameter a,parameter b | xargs -n 1 -d , run-command --a --whole --lot --of --flags

ในตัวอย่างนี้คุณเพียงแค่ให้ xargs พีชคณิตที่คุณต้องการเรียกใช้

แฟล็ก "-n 1" เพื่อบอกให้ xargs ใช้เพียง 1 ในอาร์กิวเมนต์ต่อการรัน

แฟล็ก "-d," บอกให้ xargs ค้นหา "," บนอินพุตเป็นตัวแบ่งระหว่างอาร์กิวเมนต์ที่ต้องรัน (โปรดทราบว่าหากอาร์กิวเมนต์มี "," อยู่ในนั้นคุณจะต้องเปลี่ยนสิ่งนี้เป็นอย่างอื่นหากข้อโต้แย้งของคุณไม่มีช่องว่างคุณสามารถละเว้นการตั้งค่าสถานะนี้ได้ทั้งหมด)

ดูman xargsข้อมูลเพิ่มเติม


4

นอกจากนี้คุณยังสามารถใช้ฟังก์ชั่นซึ่งไม่ จำกัด ว่าคุณจะต้องโต้แย้งการเปลี่ยนแปลงในตอนท้าย:

runcom() { run-command --a --whole --lot --of --flags parameter "$1" ; }

runcom a
runcom b

2

คุณสามารถทำการทดแทนในคำสั่งก่อนหน้า สิ่งนี้จะไม่ทำงานกับตัวอย่าง {a, b} ของคุณเนื่องจากอินสแตนซ์ทั้งหมดของ 'a' จะถูกแทนที่ด้วย 'b' แต่ลองจินตนาการว่าคุณต้องการรันคำสั่งต่อไปนี้:

run-command --a --whole --lot --of --parameter --format xml
run-command --a --whole --lot --of --parameter --format son

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

run-command --a --whole --lot --of --parameter --format xml
!!:s/xml/json/

Bash จะทำการทดแทนและรัน

run-command --a --whole --lot --of --parameter --format json

ใช้ gs (การทดแทนทั่วโลก) เพื่อทำการทดแทนหลายรายการไม่ใช่เพียงรายการเดียว


1

มีaliasคำสั่งในทุบตี:

$ alias shotcommand='run-command --a --whole --lot --of --flags parameter'

การใช้งานคือ: $ shotcommand a


นอกจากนี้ยังมีฟังก์ชั่นหากรหัสมีความซับซ้อนมากขึ้น :-)
njsg

2
วิธีนี้ใช้ได้เฉพาะเมื่อพารามิเตอร์การเปลี่ยนแปลงของฉันเป็นครั้งสุดท้ายใช่ไหม
ashays

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