Cấu hình để phát hiện nếu một lệnh không tồn tại, đề nghị cài đặt


22

Có thể zshvỏ được cấu hình để hiển thị những gì bashchương trình khi một lệnh không tồn tại, tương tự như thế này:

kahless:~$ sysv-rc-conf  
The program 'sysv-rc-conf' is currently not installed.  You can install it by typing:  
sudo apt-get install sysv-rc-conf

thay vì lời nhắc ZSH:

[kahless /home/teward]% sysv-rc-conf  
zsh: command not found: sysv-rc-conf

Lưu ý Tôi không muốn tự thay đổi lời nhắc, nhưng tôi muốn thay đổi kết quả từ zsh: command not foundthành đầu ra giống như bash The program 'progname' is currently not installed. You can install it by typing:hoặc tương tự.

Điều này có thể với ZSH không?

Câu trả lời:


22

Tính năng này được cung cấp bởi gói. Ubuntu cài đặt nó theo mặc định và làm cho nó hoạt động theo mặc định trong bash nhưng không phải trong zsh. Chỉ cần thêm dòng này vào :command-not-found Cài đặt lệnh không tìm thấy~/.zshrc

. /etc/zsh_command_not_found

Giải pháp này đã làm việc. Có cách nào để loại bỏ một dòng trong đầu ra, sau đó? (lưu ý rằng nó đã được bao gồm trong đầu ra, như là The program 'progname' is currently not installed. You can install it by typing:một phần) zsh: command not found: sysv-rc-conf
Thomas Ward

@EvilPhoenix: Bất cứ nơi nào cũng sẽ làm (ngoại trừ bên trong một chức năng hoặc một cái gì đó rõ ràng). Tôi không biết về việc loại bỏ các zsh: command not founddòng.
Gilles 'SO- ngừng trở nên xấu xa'

Được rồi, tôi có thể bỏ qua "phần không tìm thấy lệnh". Bởi vì phần cài đặt đề xuất là tốt, và thật tuyệt khi biết rằng nó đã xuất hiện vì một lệnh không tồn tại;)
Thomas Ward

đến lượt của command not foundthông điệp mà bạn có thể thêm exitvào cuối của hàm command_not_found_handlertrong /etc/zsh_command_not_found.
jens_bo

4

Lưu ý rằng bạn có thể muốn thêm một kiểm tra nếu tệp tồn tại nếu bạn đang chia sẻ .zshrc của mình qua các bản phân phối không có /etc/zsh_command_not_foundtệp:

[[ -a "/etc/zsh_command_not_found" ]] && . /etc/zsh_command_not_found

Ngoài ra, trong trường hợp bạn đang sử dụng oh-my-zsh , đã có một plugin, command-not-foundbạn có thể thêm vào pluginsbiến của mình để thực hiện điều tương tự.


1

Nếu bạn đang sử dụng oh-my-zsh , thay vào đó bạn chỉ có thể tìm "plugin" bên trong .zshrc.

Thêm command-not-foundplugin vào danh sách các plugin để tự động tải (plugin này đã được cài đặt theo mặc định).

Như thế này:

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git command-not-found)

0

Cách thức hoạt động của nó là thông qua hàm command_not_found_handle () trong bash. bash cung cấp một hook về cơ bản là một hàm được gọi khi không tìm thấy lệnh. Việc triển khai bash của Ubuntu bẫy nó và thực hiện tìm kiếm gói, trong khi bash của Debian thì không (và giống với zsh). Bạn có thể muốn kiểm tra trang của zsh để xem nếu nó có chức năng tương tự.

Đây là cách bạn có thể bắt đầu, hy vọng zsh là tương tự.

mpandit@mpandit-ubuntu:~$ command_not_found_handle() {echo 'Handler: Command not found!';}
mpandit@mpandit-ubuntu:~$ ddaadada
'Handler: Command not found!
mpandit@mpandit-ubuntu:~$

Đây không phải là một sự khác biệt trong bash của Debian và Ubuntu. Sự khác biệt là Ubuntu cài đặt command-not-foundtheo mặc định và Debian thì không. Tính năng này cũng đã tồn tại cho zsh, nó chỉ không được kích hoạt theo mặc định.
Gilles 'SO- ngừng trở nên xấu xa'

Điều này giả định rằng lệnh_not_found không được bao gồm trong hệ thống. Tuy nhiên đó không phải là điều tôi đang tìm kiếm. Phải nói rằng, câu trả lời từ @Gilles là nhiều hơn những gì tôi đang tìm kiếm, tôi chỉ đang cố gắng tìm ra nơi để bao gồm dòng anh ấy chỉ định.
Thomas Ward

Nó được gọi command_not_found_handlertrong zsh. Xem zsh.sourceforge.net/Doc/Release/Command-Execut.html .
Mikel

0

Ngoài ra, nếu bạn không muốn zsh có hành vi này 100% thời gian bạn có thể tự làm một việc như:

/usr/lib/command-not-found urxvt

hoặc thêm lệnh không tìm thấy vào $ PATH của bạn


3
Khi tôi hỏi điều này, tôi muốn nó hoạt động mọi lúc: P
Thomas Ward
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.