ฉันเข้าใจว่าการขยายรั้งคืออะไร แต่ฉันไม่รู้ว่าจะใช้งานได้อย่างไร
คุณจะใช้เมื่อไหร่?
กรุณาสอนตัวอย่างที่สะดวกและน่าทึ่งให้ฉันถ้าคุณมีเคล็ดลับของคุณเอง
ฉันเข้าใจว่าการขยายรั้งคืออะไร แต่ฉันไม่รู้ว่าจะใช้งานได้อย่างไร
คุณจะใช้เมื่อไหร่?
กรุณาสอนตัวอย่างที่สะดวกและน่าทึ่งให้ฉันถ้าคุณมีเคล็ดลับของคุณเอง
คำตอบ:
การขยายตัวของ Brace นั้นมีประโยชน์มากหากคุณมีชื่อพา ธ ยาว ฉันใช้มันเป็นวิธีที่รวดเร็วในการสำรองไฟล์ :
cp /a/really/long/path/to/some/file.txt{,.bak}
จะคัดลอก/a/really/long/path/to/some/file.txt
ไปที่/a/really/long/path/to/some/file.txt.bak
นอกจากนี้คุณยังสามารถใช้งานได้ในลำดับ ผมเคยดาวน์โหลดหลายหน้าจากเว็บ:
wget http://domain.com/book/page{1..5}.html
หรือ
for i in {1..100}
do
#do something 100 times
done
program
ได้รับสามคำ: "-f file1" "-f file2" "-f file3"
แทนจาก "-f" "file1" "-f" "file2" "-f" "file3"
6:
for
ลูปนั้นไม่มีจุดหมายเพราะคุณสามารถเขียนได้for ((i=1; i<=100; i++))
และมีประสิทธิภาพมากกว่า
การขยายของ Brace มาสะดวกมากเมื่อสร้างโครงสร้างไดเรกทอรีขนาดใหญ่:
mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}
สิ่งนี้จะทำให้คุณ
find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2
คุณสามารถก้าวต่อไปอีกขั้นและใส่การขยายรั้งลงในการขยายรั้ง:
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
สิ่งนี้จะให้โครงสร้างไดเรกทอรีเหมือนกับตัวอย่างด้านบน
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
) ไม่ได้มีจุดประสงค์ใด ๆ mkdir -p dir1/subdir{1,2}/subsubdir{1,2}
คุณจะได้ทำเพียงแค่นี้:
subdir1
และ subdir2
ในความหมายที่ไม่ใช่ตัวอักษร แทนที่subdir1
ด้วยcat
และsubdir2
ด้วยdog
ตัวอย่างเช่น
ฉันใช้เมื่อต้องการลดการพิมพ์:
geany /path/to/file1 /path/to/file2
# versus
geany /path/to/file{1,2}
ตัวอย่างอื่น:
wajig install libpam0g-dev libiw-dev libdb-dev
# versus
wajig install lib{pam0g,iw,db}-dev
ฉันใช้มันเพื่อเปรียบเทียบผลการทดสอบจริงกับผลการทดสอบที่ต้องการระหว่างการพัฒนา หากการทดสอบ # 41 ล้มเหลวคุณสามารถเห็นความแตกต่างระหว่างเอาต์พุตการทดสอบ (ในไฟล์ tests.output / 041) และเอาต์พุตที่ต้องการ (ในไฟล์ tests.out / 041):
$ diff tests.{out,output}/041
บางกรณีที่พบบ่อยสำหรับฉันคือ:
สำหรับการเปลี่ยนชื่อ:
mv myText.{txt,tex}
หรือ
mv myText.tex{,.old}
หรือ
cp myText.tex{,.backup}
(แม้ว่าจะยุ่งน้อยกว่าในการใช้การควบคุมเวอร์ชันสำหรับ 2 งานสุดท้าย)
สำหรับการเปรียบเทียบ (กล่าวถึงแล้ว):
diff path{1,2}/a.txt
มีคำตอบที่ดีมากมายที่นี่ แต่ไม่มีใครพูดถึงเมื่อไม่ใช้การขยายรั้ง เช่นเดียวกับผู้ตอบอื่น ๆ ฉันใช้การขยายรั้งในบรรทัดคำสั่งค่อนข้างน้อย ฉันยังใช้มันในชื่อแทนและฟังก์ชั่นของฉันเพราะฉันสามารถคาดหวังสมาร์ทเชลล์
ฉันไม่ได้ใช้มันในเชลล์สคริปต์ของฉัน (เว้นแต่จะมีเหตุผลอื่น ๆ ที่สคริปต์ควรจะทุบตีหรือ zsh แม้ว่าในกรณีเหล่านั้นดีที่สุดในการอัพเกรดเป็นภาษาสคริปต์ "จริง" เช่นperl
หรือpython
) การขยายของตัวรั้งไม่สามารถเคลื่อนย้ายได้เนื่องจากไม่ได้อยู่ในมาตรฐานเชลล์ POSIX แม้ว่ามันจะทำงานใน/bin/sh
- เชลล์สคริปต์ของคุณshebang ed แต่มันจะไม่ทำงานบนระบบที่มี/bin/sh
เชลล์ที่ถูกสแนปชอตมากกว่า(เช่นdash
)
ในกรณีที่มีความแตกต่างของหลักเดียวคุณไม่จำเป็นต้องมีการขยายรั้ง คลาสตัวละครจะพอเพียง:
Bashism:
diff file{1,2}
พกพา:
diff file[12]
file{1,2}
จะขยายเป็นเสมอfile1 file2
ในขณะที่file[12]
ขยายไปยังชื่อไฟล์ที่มีอยู่เท่านั้น: เช่นถ้าfile1
มี แต่file2
ไม่file[12]
ขยายเป็นfile1
เท่านั้น การ[]
ขยายตัวเป็นเวอร์ชัน?
ขยายตัวที่ถูก จำกัด จริงๆ(และเรียกว่า "การขยายชื่อพา ธ ")
program -f file1 -f file2 -f file3
คุณสามารถทำได้program "-f file"{1..3}