Truy cập vào lệnh không tìm thấy trình xử lý của Edward trong Ubuntu


9

Tôi muốn nối vào trình xử lý cho lệnh không tìm thấy

wim@SDFA100461C:~$ thing
No command 'thing' found, did you mean:
 Command 'tping' from package 'lam-runtime' (universe)
 Command 'thin' from package 'thin' (universe)
thing: command not found

Tôi muốn ghi đè hành vi này bằng kịch bản của riêng tôi.

Cụ thể, tôi muốn kiểm tra xem lệnh có tồn tại trong đầu ra không lsvirtualenv -b, và nếu vậy tôi muốn kích hoạt virtualenv đó.

Tôi nên bắt đầu hack ở đâu?


1
Điều này có thể giúp đỡ: askubuntu.com/a/73282/10127
glenn Jackman

Câu trả lời:


8

Nói chung

Các Tạp chí Linux có một bài viết tốt đẹp:

Từ trang người đàn ông của bash:

... Việc tìm kiếm đầy đủ các thư mục trong PATH chỉ được thực hiện nếu không tìm thấy lệnh trong bảng băm. Nếu tìm kiếm không thành công, shell sẽ tìm kiếm một hàm shell được xác định có tên là command_not_found_handle. Nếu hàm đó tồn tại, nó được gọi với lệnh ban đầu và các đối số của lệnh ban đầu làm đối số của nó và trạng thái thoát của hàm trở thành trạng thái thoát của trình bao. Nếu chức năng đó không được xác định, trình bao sẽ in thông báo lỗi và trả về trạng thái thoát là 127.

Một grep nhanh trong / etc đã phát hiện ra nơi nó đang xảy ra. Chính hàm này nằm trong / etc / bash_command_not_found và hàm đó được bao gồm (nếu nó tồn tại) trong phiên bash của bạn thông qua /etc/bash.bashrc.

Ubuntu 14.04

Bằng chứng thực nghiệm cho thấy rằng trên bản cài đặt Ubuntu 14.04, tệp / etc / bash_command_not_found không tồn tại, tuy nhiên, tệp chính xác là tập lệnh python, nằm ở / usr / lib / lệnh không tìm thấy


1
Điều này đặt tôi vào đúng đường dẫn, nhưng chương trình thực tế là một kịch bản python nằm ở /usr/lib/command-not-found. Trên bản cài đặt Ubuntu 14.04 của tôi, tệp /etc/bash_command_not_foundkhông tồn tại.
wim

Cảm ơn, tôi đã thêm câu trả lời của mình cho người xem trong tương lai
Andrew Stubbs

1

Đối với bash, hành vi của nó bị chi phối bởi chức năng shell command_not_found_handle(Xem man bash, trong phần THỰC HÀNH QUY ĐỊNH).

Để xem hành vi nào được xác định bởi chức năng đó, bạn có thể đưa ra:

declare -p -f command_not_found_handle

Bạn có thể thay đổi chương trình nào được sử dụng bằng cách xác định lại command_not_found_handlechức năng.

Trong Ubuntu 14.04 LTS, có vẻ như hành vi mặc định được xác định trực tiếp trong /etc/bash.bashrc:

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
    function command_not_found_handle {
            # check because c-n-f could've been removed in the meantime
            if [ -x /usr/lib/command-not-found ]; then
               /usr/lib/command-not-found -- "$1"
               return $?
            elif [ -x /usr/share/command-not-found/command-not-found ]; then
               /usr/share/command-not-found/command-not-found -- "$1"
               return $?
            else
               printf "%s: command not found\n" "$1" >&2
               return 127
            fi
    }
fi
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.