รั้งการขยาย: รันหลายคำสั่งแทนที่จะขยายในหนึ่งบรรทัด?


11

เมื่อคุณใช้การขยายรั้งในทุบตีสิ่งที่ต้องการ

echo {a,b,c}

กลายเป็น

echo a b c

มีวิธีขยายคำสั่งเป็น 3 คำสั่งแยกกันหรือไม่สำหรับแต่ละส่วนขยาย

ดังนั้น:

echo {a,b,c}

จะกลายเป็น

echo a
echo b
echo c

คำตอบ:


12

นี่เป็นเพียงคำถาม "เพราะฉันอยากรู้" หรือมีกรณีการใช้งานจริงหรือ? เราสามารถผ่านยิมนาสติกเพื่อทำมันให้เสร็จ:

$ eval echo\ {a,b,c}\;
a
b
c

แต่ฉันจะตามหาใครก็ตามที่ใส่คำสั่งที่น่ารังเกียจเหล่านี้ลงในสคริปต์ระบบของเรา

ทำไมไม่ไปเพื่อความชัดเจนแทน:

$ for X in {a,b,c}; do echo $X; done

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


4
@peth - ฉันสมมติว่านี่เป็นตัวอย่างที่ง่าย ถ้ามันง่ายเหมือนรายการคุณก็พูดถูก ถ้ามันเป็นอะไรที่มากกว่าfile-{r,b,g}{m,n,o}{x,y.z}.fooนั้นล่ะก็ให้ใช้รูปแบบสั้นกว่าการแจกแจงค่าทั้งหมด 27
unpythonic

@peth - ฉันคิดว่ามันเป็นคำถามติดตามที่ดี
unpythonic

ฉันอยากรู้เรื่องนี้มานานแล้วขอบคุณ! :)
Sirex

1
กรณีการใช้งานคือโปรแกรมที่ไม่ยอมรับไฟล์มากกว่าหนึ่งไฟล์ (ตัวอย่าง) ดังนั้นการขยายตัวจะไม่ทำงาน ดังนั้นจึงเป็นการดีที่จะสามารถเรียกใช้โปรแกรมได้หลายครั้งอย่างง่ายดาย การforทำงานสำหรับสิ่งนี้ แต่ก็ยังมีการพิมพ์เพิ่มเติม: P
houbysoft

ฉันใช้มันเพื่อล้างสาขา git หลายแห่ง:eval git branch -d \{ branch-a, branch-b }\;
Kit

3

จากคำตอบที่เลือกของ Mark Mannฉันสามารถได้รับตัวอย่างนี้ซึ่งใช้งานได้ดียิ่งขึ้น:

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

สิ่งที่แสดงคือเมื่อคุณใช้หลายครั้งของการขยายรั้งภายในบรรทัดตัวอย่างดั้งเดิมของ Mark จะพิมพ์ทุกรูปแบบทีละรายการ แต่ฉันต้องการใช้คำตอบของเขาเพื่อย้าย / เปลี่ยนชื่อหลายไฟล์ เพื่อให้แน่ใจว่าผลลัพธ์ที่ตรงกับรูปแบบที่mvปกติคาดหวัง ( mv oldfilename newfilename) ฉันหนีการเกิดขึ้นครั้งที่สองของการขยายรั้งเพื่อที่จะไม่ได้รับการประเมินจนกระทั่งหลังจากevalคำสั่งเริ่มต้นได้ดำเนินการ

เนื่องจากเอาต์พุตข้างต้นปรากฏขึ้นตามที่คาดไว้ฉันจึงสามารถเรียกใช้คำสั่งต่อไปนี้:

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

ขอบคุณ Mark มากสำหรับคำตอบดั้งเดิมของเขา โปรดโหวตคำตอบของเขาถ้าคุณชอบสิ่งที่คำตอบของเขาอนุญาตให้ฉันทำ :-)


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