Kaitkan ke handler "command not found" di Ubuntu

9

Saya ingin menghubungkan ke handler untuk perintah tidak ditemukan

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

Saya ingin mengganti perilaku ini dengan skrip saya sendiri.

Secara khusus, saya ingin memeriksa apakah perintah ada di output lsvirtualenv -b, dan jika demikian saya ingin mengaktifkan virtualenv itu.

Di mana saya harus mulai meretas?

wim
sumber
1
Ini mungkin membantu: askubuntu.com/a/73282/10127
glenn jackman

Jawaban:

8

Secara umum

The Linux Journal memiliki artikel yang cukup bagus:

Dari halaman manual bash:

... Pencarian penuh direktori di PATH dilakukan hanya jika perintah tidak ditemukan di tabel hash. Jika pencarian tidak berhasil, shell mencari fungsi shell yang didefinisikan bernama command_not_found_handle. Jika fungsi itu ada, itu dipanggil dengan perintah asli dan argumen perintah asli sebagai argumennya, dan status keluar fungsi menjadi status keluar dari shell. Jika fungsi itu tidak didefinisikan, shell mencetak pesan kesalahan dan mengembalikan status keluar 127.

dan

Grep cepat di / etc menemukan di mana itu terjadi. Fungsi itu sendiri ada di /etc/bash_command_not_found dan fungsi itu dimasukkan (jika ada) di sesi bash Anda melalui /etc/bash.bashrc.

Ubuntu 14.04

Bukti empiris menunjukkan bahwa pada instalasi Ubuntu 14.04, file / etc / bash_command_not_found tidak ada, namun file yang benar adalah skrip python, yang terletak di / usr / lib / command-not-found

Andrew Stubbs
sumber
1
Ini membuat saya di jalur yang benar, tetapi program sebenarnya adalah skrip python yang terletak di /usr/lib/command-not-found. Pada instalasi Ubuntu 14.04 saya, file /etc/bash_command_not_foundtidak ada.
wim
Terima kasih, saya telah menambahkannya ke dalam jawaban saya untuk pemirsa di masa depan
Andrew Stubbs
1

Sebab bash, perilakunya diatur oleh fungsi shell command_not_found_handle(Lihat man bash, di bawah COMMAND EXECUTION).

Untuk melihat perilaku apa yang didefinisikan oleh fungsi itu, Anda dapat mengeluarkan:

declare -p -f command_not_found_handle

Anda dapat mengubah program mana yang digunakan dengan mendefinisikan kembali command_not_found_handlefungsi.

Di Ubuntu 14.04 LTS, tampaknya perilaku default didefinisikan langsung dalam /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
Randall
sumber