Apt-get * wildcard พร้อม ZSH


15

ZSH:

sudo apt-get remove --purge ubuntuone-* 
ERROR: zsh: no matches found: ubuntuone-*

ใช้งานได้กับ Bash มีปัญหาอะไร ? :-D

คำตอบ:


13

ใช่zshและbashประพฤติแตกต่างกันในเรื่องนี้

ในzshเมื่อคุณพูด " ubuntuone-*" มันจะดูในไดเรกทอรีการทำงานปัจจุบันของคุณสำหรับไฟล์ที่ขึ้นต้นด้วยubuntuone-- เพราะมันไม่พบไฟล์ใด ๆ เลยมันจะระบุว่า " no matches" และไม่ได้รันคำสั่ง

bashใช้วิธีการที่แตกต่างกัน - มันจะค้นหาไฟล์ที่เริ่มต้นด้วยubuntuone-ในไดเรกทอรีการทำงานปัจจุบัน แต่ถ้ามันไม่พบสิ่งที่มันบอกกับตัวเอง "บางทีโปรแกรมที่ฉันเรียกใช้รู้วิธีจัดการกับตัวแทน" และผ่านไป " ubuntuone-*"ปิดsudo apt-getเป็นอาร์กิวเมนต์ตามตัวอักษร

หากคุณมีไฟล์ในไดเรกทอรีการทำงานปัจจุบันของคุณที่เรียกว่าubuntuone-ffdjhjerทุบตีจะพยายามดำเนินการsudo apt-get remove --purge ubuntuone-ffdjhjerซึ่งอาจจะล้มเหลว

ในzsh(และในbash) คุณสามารถใช้เครื่องหมายคำพูดเดี่ยวเพื่อบอกว่าไม่ให้ขยายไวด์การ์ด แต่เพื่อส่งต่อเช่นเดียวกับใน:

sudo apt-get remove --purge 'ubuntuone-*'

2
ฉันสามารถทำให้ zsh ทำงานเป็น Bash ในลักษณะนั้นได้หรือไม่?
mirandalol

ฉันไม่รู้ แต่การวิจัยนิดหน่อยที่ฉันได้ทำไปแล้วชี้ให้เห็นว่าไม่ ไม่ว่าในกรณีใดจะเป็นการดีกว่าเสมอ (แม้ใน bash) เพื่อเข้ารหัสอาร์กิวเมนต์ในอัญประกาศเดี่ยวถ้าคุณไม่ต้องการให้เชลล์ขยาย wildcard เพราะแม้ใน bash คำสั่งจะไม่ทำสิ่งที่คุณต้องการหากไฟล์ใน CWD ตรงกับสัญลักษณ์แทน เช่นฉันพิมพ์dpkg -l 'linux*'ทุบตีเพื่อดูเมล็ดที่ติดตั้งทั้งหมด
David Purdue

10

คำตอบนี้อาจจะสายไปสักหน่อย แต่ก็มีวิธีแก้ไขนี้ จากบรรทัดคำสั่งรัน:

unsetopt no_match

สิ่งนี้ใช้งานได้ดี
neaumusic

หรือshopt -s failglobในbashการแก้ไข bashจึงจะทำงานเหมือนzshและอื่น ๆ ที่ทันสมัยเช่นเปลือกหอยfishหรือtcsh ว่ามีการแก้ไขที่ misfeature ของบอร์นเชลล์โดยคำสั่งอาจจะยังคงทำงานแม้ว่า globs ไม่ตรงกับ
Stéphane Chazelas

@ StéphaneChazelas Yoda
OpenCoderX

1

มีอีกวิธีหนึ่งในการป้องกันการขยายใน zsh ซึ่งฉันชอบมากกว่าราคาคือ:

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