Apt-get * ký tự đại diện với ZSH


15

ZSH:

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

Hoạt động trên Bash. Có vấn đề gì vậy? : -D

Câu trả lời:


13

Vâng, zshbashhành xử khác nhau trong vấn đề này.

Trong zsh, khi bạn nói " ubuntuone-*" nó sẽ tìm trong thư mục làm việc hiện tại của bạn cho các tệp bắt đầu bằng ubuntuone-- vì nó không tìm thấy bất kỳ, nó nói " no matches" và không chạy lệnh.

bashcó một chiến thuật khác - nó cũng tìm kiếm các tệp bắt đầu ubuntuone-trong thư mục làm việc hiện tại, nhưng nếu nó không tìm thấy bất kỳ thứ gì nó tự nói, "Có thể chương trình tôi đang gọi biết cách xử lý ký tự đại diện" và cứ thế vượt qua " ubuntuone-*"Tắt sudo apt-getnhư một cuộc tranh luận theo nghĩa đen.

Nếu bạn có một tệp trong thư mục làm việc hiện tại của bạn được gọi ubuntuone-ffdjhjer, thì bash sẽ cố thực thi sudo apt-get remove --purge ubuntuone-ffdjhjer, có thể sẽ thất bại.

Trong zsh(và trong bash), bạn có thể sử dụng các dấu ngoặc đơn để nói với nó không phải để mở rộng ký tự đại diện mà để chuyển nó vào, như trong:

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

2
Tôi có thể làm cho zsh cư xử như Bash theo cách đó không?
mirandalol

Tôi không biết, nhưng một ít nghiên cứu tôi đã thực hiện cho đến nay cho thấy không. Trong mọi trường hợp, sẽ tốt hơn (ngay cả trong bash) để bao gồm các đối số trong các dấu ngoặc đơn nếu bạn không muốn shell mở rộng các ký tự đại diện, bởi vì ngay cả trong bash, lệnh sẽ không làm những gì bạn muốn nếu một tệp trong CWD phù hợp với ký tự đại diện. ví dụ: tôi luôn gõ dpkg -l 'linux*'bash để xem tất cả các kernel đã cài đặt.
David Purdue

10

Có thể hơi muộn câu trả lời này, nhưng có một cách để khắc phục điều này. Từ dòng lệnh thực thi:

unsetopt no_match

điều này hoạt động rất tốt
neaumusic

Hoặc shopt -s failglobtrong bashđể sửa chữa bash nên nó hoạt động như zshvà vỏ hiện đại khác thích fishhay tcsh rằng đã sửa lỗi này misfeature của vỏ Bourne theo đó một lệnh vẫn có thể được chạy ngay cả khi những đống không phù hợp.
Stéphane Chazelas

@ StéphaneChazelas yoda
OpenCoderX

1

Có một cách khác để ngăn chặn sự mở rộng trong zsh, mà tôi thích hơn các trích dẫn:

sudo apt-get remove --purge ubuntuone-\*
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.