Khi bạn gõ lệnh không tồn tại trong hệ thống, bash sẽ chạy chức năng command_not_found_handle()
. Trong chức năng này có một lệnh gọi /usr/lib/command-not-found
kịch bản in tin nhắn.
Ubuntu 12.04
Tôi đoán đầu tiên thay đổi nguồn của tập lệnh này để in tin nhắn stdout
thay vào đó stderr
, nhưng khi tôi đang đọc nguồn tập lệnh, tôi thấy rằng bạn có thể định cấu hình nó để chỉ hỏi bạn nếu bạn muốn cài đặt gói bị thiếu.
Nếu bạn xuất biến, COMMAND_NOT_FOUND_INSTALL_PROMPT
bạn sẽ được yêu cầu cài đặt gói bị thiếu:
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT=""
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
Do you want to install it? (N/y)y
sudo apt-get install git
[sudo] password for pbm:
Các phiên bản cũ hơn của Ubuntu
Thật không may là không có COMMAND_NOT_FOUND_INSTALL_PROMPT
vì vậy tôi có thể tìm thấy một vài lựa chọn khác:
1) Cài đặt gói từ 12.04 - không phải là vấn đề - chỉ có vài tập lệnh trong Python để nó hoạt động (chưa được kiểm tra!).
2) Thay đổi stderr
thành stdout
. Để làm điều đó, chỉnh sửa tập tin /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py
và thay đổi stderr
thành stdout
trong dòng 237 và 240.
Sau đó, bạn có thể sử dụng nó theo cách này:
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ `git`
//Installation begins
Nếu bạn thêm -y
tùy chọn vào apt-get
lệnh trong dòng 237 và 240, bạn cũng có thể sử dụng cú pháp !! | sh
.
3) Bạn cũng có thể sửa đổi tập lệnh này từ dòng 242 theo cách này:
print >> sys.stderr, _("You can install it by typing:")
f = open("%s/.install-missing" % os.path.expanduser('~'),'w')
print >> sys.stderr, "sudo apt-get install %s" % packages[0][0]
print >> f, "sudo apt-get install %s" % packages[0][0]
f.close()
Theo cách này, bạn sẽ nhận được lệnh của mình trong tệp ~/.install-missing
, vì vậy bạn có thể tạo bí danh:
alias im="chmod +x ~/.install-missing; ~/.install-missing"
Nếu bạn gọi im
gói sẽ được cài đặt.
/usr/lib/command-not-found
nhưng không có liên quan đếnCOMMAND_NOT_FOUND_INSTALL_PROMPT
- suy nghĩ?