ทำไม“ cat {foo}” ไม่ส่งออก foo แต่“ cat {foo, bar}” ทำเช่นนั้น


12

ฉันพยายามเชื่อมไฟล์ข้อความในโฟลเดอร์ย่อยและพยายาม:

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

อย่างไรก็ตามสิ่งนี้ไม่ได้ส่งคืนสิ่งใด ดังนั้นลองเพิ่ม 'subfolder2' ที่ไม่มีอยู่

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

และในครั้งนี้มันได้ผลโดยทำการต่อไฟล์เข้าด้วยกัน ทำไมสิ่งนี้เกิดขึ้น


2
ใช้echoแทนcatเพื่อดูบรรทัดคำสั่งที่คุณได้รับ (หรือใช้set -xสำหรับการแก้ไขข้อบกพร่อง)
Peter Cordes

คำตอบ:


22

ตามคำจำกัดความการขยายรั้งใน GNU Bash ต้องการทั้งนิพจน์ลำดับหรือชุดของค่าที่คั่นด้วยเครื่องหมายจุลภาค:

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

คุณสามารถอ่านคู่มือสำหรับรายละเอียด

ตัวอย่างง่ายๆไม่กี่:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2

21

{subfolder1}ประเมิน{subfolder1}ว่าเนื่องจากไม่มีทางเลือกอื่น ใช้subfolder1แทน


2
หมายเหตุว่ามันเป็นความแตกต่างจากในcsh(ที่ขยายตัวมาจากรั้ง) หรือtcsh fish
Stéphane Chazelas

1

เครื่องมือจัดฟันจะขยายออกหากพวกเขามีสตริงที่คั่นด้วย coma เช่น {abc, def} หรือช่วงตัวอย่างเช่น {a..e} ที่ระบุระหว่างพวกเขา

ในกรณีของคุณคุณสามารถเขียนโฟลเดอร์ย่อย 1 โดยไม่ต้องใส่มันไว้ในวงเล็บเนื่องจากไม่จำเป็นต้องใช้มัน

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var

น่าเสียดายที่/path/{a,}/filenameขยายเป็นสองสาย/path/a/filenameและ /path//filenameอาจไม่ต้องการ
Kusalananda

ขอบคุณ @KanDananda สำหรับการแก้ไขให้ฉันใช่ทุบตีจะให้คำเตือนการรักษา "การเปลี่ยนเส้นทางที่ไม่ชัดเจน"
Neo_Returns

ไม่มีคุณจะได้รับambiguous redirect ถ้าคุณพยายามที่จะเปลี่ยนเส้นทางไปลงในไฟล์ที่กำหนดโดยตัวแปร unquoted echo 'hello' >$idontexistที่ไม่มีค่าเช่น
Kusalananda

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