คำถามติดแท็ก brace-expansion

กลไกเชลล์ที่ใช้ในการสร้างสตริงโดยพลการ

6
เมื่อใดที่คุณใช้การขยายรั้ง
ฉันเข้าใจว่าการขยายรั้งคืออะไร แต่ฉันไม่รู้ว่าจะใช้งานได้อย่างไร คุณจะใช้เมื่อไหร่? กรุณาสอนตัวอย่างที่สะดวกและน่าทึ่งให้ฉันถ้าคุณมีเคล็ดลับของคุณเอง

6
วิธีสร้างลำดับด้วยเลขศูนย์นำหน้าโดยใช้การขยายรั้ง
เมื่อฉันใช้สิ่งต่อไปนี้ฉันได้รับผลลัพธ์ตามที่คาดไว้: $ echo {8..10} 8 9 10 ฉันจะใช้การขยายรั้งนี้ในวิธีที่ง่ายเพื่อให้ได้ผลลัพธ์ต่อไปนี้ได้อย่างไร $ echo {8..10} 08 09 10 ตอนนี้ฉันสามารถใช้สิ่งนี้ได้seq(ไม่ลอง) แต่นั่นไม่ใช่สิ่งที่ฉันกำลังมองหา ข้อมูลที่มีประโยชน์อาจเป็นได้ว่าฉันถูก จำกัด รุ่น bash นี้ (หากคุณมีzshวิธีแก้ไข แต่ไม่มีbashวิธีแก้ไขโปรดแชร์ด้วย) $ bash -version GNU bash, version 3.2.51(1)-release (x86_64-suse-linux-gnu)

4
ฉันจะใช้ตัวแปร $ ในการขยายเชลล์ของลำดับได้อย่างไร
ฉันต้องการที่จะใช้$var inการขยายตัวของเปลือกหอยกับช่วงในทุบตี แค่วาง{$var1..$var2}ไม่ได้ดังนั้นฉันจึงไป "ด้านข้าง" ... ผลงานต่อไปนี้ แต่มันเป็น kludge เล็กน้อย # remove the split files echo rm foo.{$ext0..$extN} rm-segments > rm-segments source rm-segments มีวิธี "ปกติ" มากกว่านี้ไหม?


6
cat ไฟล์จำนวนมากเข้าด้วยกันตามลำดับที่ถูกต้อง
ฉันมีประมาณ 15,000 ไฟล์ที่มีชื่อfile_1.pdb, file_2.pdbฯลฯ ฉันสามารถแมวประมาณไม่กี่พันเหล่านี้ในการสั่งซื้อโดยการทำ: cat file_{1..2000}.pdb >> file_all.pdb อย่างไรก็ตามหากฉันทำสิ่งนี้กับไฟล์ 15,000 ไฟล์ฉันจะได้รับข้อผิดพลาด -bash: /bin/cat: Argument list too long ฉันได้เห็นปัญหานี้ได้รับการแก้ไขโดยการทำfind . -name xx -exec xxแต่จะไม่รักษาลำดับที่ไฟล์เข้าร่วม ฉันจะบรรลุสิ่งนี้ได้อย่างไร


3
รั้งการขยายตัวลึกลับใน Bash
นี้: $ echo {{a..c},{1..3}} ผลิตสิ่งนี้: a b c 1 2 3 ซึ่งเป็นสิ่งที่ดี แต่ยากที่จะอธิบายให้ที่ $ echo {a..c},{1..3} จะช่วยให้ a,1 a,2 a,3 b,1 b,2 b,3 c,1 c,2 c,3 เอกสารนี้อยู่ที่ไหนสักแห่ง? ทุบตีอ้างอิงไม่ได้พูดถึงมัน (แม้ว่ามันจะมีตัวอย่างการใช้มัน)

5
bash: ใช้ตัวแปรเพื่อเก็บการเปลี่ยนเส้นทาง stderr | stdout
มีวิธีการเปลี่ยนเส้นทาง stdout และ stderr ผ่านตัวแปรเช่นเพิ่มตัวเลือกคำสั่งในสคริปต์ใด ๆ ตัวอย่างเช่นฉันมีสคริปต์: #!/bin/bash -x TEST=">/dev/null 2>&1" OPT='-p -v' mkdir $OPT 123/123/123 $TEST ฉันเห็นว่า OPT ถูกแทนที่ด้วย-pไม่มีปัญหาใด ๆ และทุบตีตีความมันเป็นตัวเลือก แต่การเปลี่ยนเส้นทางตีความเป็นชื่อไดเรกทอรี $ ./test.sh + TEST='>/dev/null 2>&1' + OPT='-p -v' + mkdir -p -v 123/123/123 '>/dev/null' '2>&1' mkdir: created directory `123/123' mkdir: created directory `123/123/123' mkdir: created directory `>/dev' …

3
ใช้เครื่องหมายปีกกา (เครื่องหมายปีกกา) เพื่อสร้างโครงสร้างโฟลเดอร์ด้วย `mkdir -p`
ในฐานะman mkdirรัฐ -p, --parents no error if existing, make parent directories as needed เมื่อฉันรันคำสั่งนี้ mkdir -p work/{F1,F2,F3}/{temp1,temp2} มันจะสร้างโครงสร้างของโฟลเดอร์เช่นนี้workโฟลเดอร์หลักแล้วF1, F2, F3โฟลเดอร์และเด็กtemp1และtemp2โฟลเดอร์เด็กอายุต่ำกว่าสามโฟลเดอร์หลักF1, ,F2F3 work -F1 -temp1 -temp2 -F2 -temp1 -temp2 -F3 -temp1 -temp2 ตอนนี้ปัญหาคือว่าผมต้องการที่จะสร้างtemp1, temp2โฟลเดอร์เฉพาะภายใต้F1ไม่อยู่ภายใต้F2และF3แต่ฉันสับสนเกี่ยวกับวิธีการที่ฉันสามารถเขียนคำสั่งที่จะทำสิ่งที่ฉันต้องการ

3
ทำไม systemctl \ {restart, status} \ sshd \; งาน?
เอาต์พุตของคำสั่งด้านบนเมื่อส่งผ่าน echo คือ: # echo systemctl\ {restart,status}\ sshd\; systemctl restart sshd; systemctl status sshd; แม้ว่าฉันจะวางเอาต์พุตไปที่เทอร์มินัลก็ตาม แต่เมื่อฉันพยายามเรียกใช้คำสั่งโดยตรงฉันจะได้รับ: # systemctl\ {restart,status}\ sshd\; bash: systemctl restart sshd;: command not found... ฉันมีสองคำถาม .. วิธีการทดแทนและการขยายตัวนี้เรียกว่าอะไรกันแน่? (เพื่อให้ฉันสามารถค้นคว้าและเรียนรู้เพิ่มเติมเกี่ยวกับมันและวิธีการใช้อย่างถูกต้อง) ฉันทำอะไรผิดที่นี่ ทำไมมันไม่ทำงาน

4
เมื่อใดที่ {a, b, c} ถูกขยายเป็น bash เมื่อใด
สคริปต์ทุบตีที่มี for i in {a,b}-{1,2}; do echo $i; done พิมพ์ a-1 a-2 b-1 b-2 เมื่อดำเนินการ นี่คือสิ่งที่ฉันคาดไว้ - ขณะที่การ{a,b}ก่อสร้างขยายออกไป อย่างไรก็ตามเมื่อสคริปต์ (อื่น) มี v={a,b}-{1,2} echo $v มันพิมพ์ {a,b}-{1,2} ซึ่งไม่ใช่สิ่งที่ฉันคาดหวัง a-1 a-2 b-1 b-2ผมคาดว่ามันจะพิมพ์ เห็นได้ชัดว่าการ{a,b}สร้างไม่ได้ขยาย ฉันสามารถทำให้มันขยายได้อย่างนั้น v=$(echo {a,b}-{1,2}) จากข้อสังเกตเหล่านี้ฉันมีสองคำถาม: 1) {a,b}โครงสร้างจะขยายเมื่อไหร่? 2) เป็น$(echo {a,b}-{1,2})วิธีที่ต้องการเพื่อกระตุ้นการขยายเมื่อต้องการหรือไม่

3
ทำไม“ cat {foo}” ไม่ส่งออก foo แต่“ cat {foo, bar}” ทำเช่นนั้น
ฉันพยายามเชื่อมไฟล์ข้อความในโฟลเดอร์ย่อยและพยายาม: cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var อย่างไรก็ตามสิ่งนี้ไม่ได้ส่งคืนสิ่งใด ดังนั้นลองเพิ่ม 'subfolder2' ที่ไม่มีอยู่ cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var และในครั้งนี้มันได้ผลโดยทำการต่อไฟล์เข้าด้วยกัน ทำไมสิ่งนี้เกิดขึ้น

3
Bash brace expansion หลังพา ธ สแลช
ฉันกำลังพยายามคัดลอกไฟล์ไปยังชื่ออื่นในไดเรกทอรีเดียวกันโดยใช้การขยายรั้ง ฉันใช้ bash 4.4.18 นี่คือสิ่งที่ฉันทำ: cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin} แต่ฉันได้รับข้อผิดพลาดนี้: cp: cannot stat '/home/xyz/some/dir/{my-file-to-rename.bin,': No such file or directory แม้แต่การขยายรั้งอย่างง่ายเช่นนี้ก็ทำให้ฉันมีข้อผิดพลาดเดียวกัน cp {my-file-to-rename.bin, new-name-of-file.bin} ผมทำอะไรผิดหรือเปล่า?

3
เป็นไปได้ที่จะใช้วงเล็บปีกกา (การเปลี่ยนรูป) และการขยายอาร์เรย์พร้อมกันไหม
{}ไวยากรณ์ส่วนขยายของ Bash อนุญาตให้สร้างวิธีเรียงสับเปลี่ยนได้ง่าย # echo {b,c,d}{a,e,i,o,u} ba be bi bo bu ca ce ci co cu da de di do du อย่างไรก็ตามมันไม่ชัดเจนสำหรับฉันถ้า / เป็นไปได้ที่จะใช้สิ่งนี้พร้อมกับอาร์เรย์ยกเว้นในการใช้งานที่น่าอึดอัดใจมาก$() echoและeval มีวิธีง่ายๆในการใช้อาร์เรย์ที่มีการขยายหยิก (เปลี่ยนรูป)? เพื่อประโยชน์เช่นลองจินตนาการถึงสิ่งที่ชอบ (ซึ่งไม่ได้ผลแน่นอน): CONS=( b c d ) VOWEL=( a e i o u ) echo {${CONS[@]}}{${VOWEL[@]}}

1
ทำไมเสียงก้องจับคู่ไฟล์บางไฟล์สองครั้ง?
$ touch file{1..12} $ echo *e{1..12} file1 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12 $ echo *{1..12} file1 file11 file12 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12 ฉันไม่เข้าใจว่าทำไมสิ่งนี้จึงเกิดขึ้น กรุณาช่วยอธิบายหน่อยได้ไหม

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