Ubuntuで「コマンドが見つかりません」ハンドラーにフックする


9

見つからないコマンドのハンドラにフックしたい

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

この動作を自分のスクリプトで上書きしたいと思います。

具体的には、コマンドの出力にコマンドが存在するかどうかを確認し、存在する場合はlsvirtualenv -bそのvirtualenvをアクティブ化したいと思います。

ハッキングはどこから始めればよいですか?


1
これは役立つかもしれません:askubuntu.com/a/73282/10127
グレン・ジャックマン

回答:


8

一般に

Linuxのジャーナルは、かなり良い記事があります。

bashのmanページから:

... PATH内のディレクトリの完全検索は、コマンドがハッシュテーブルで見つからない場合にのみ実行されます。検索が失敗した場合、シェルはcommand_not_found_handleという名前の定義済みシェル関数を検索します。その関数が存在する場合、元のコマンドと元のコマンドの引数を引数として呼び出され、関数の終了ステータスがシェルの終了ステータスになります。その関数が定義されていない場合、シェルはエラーメッセージを出力し、127の終了ステータスを返します。

そして

/ etcの簡単なgrepは、それが起こっている場所を発見しました。関数自体は/ etc / bash_command_not_foundにあり、その関数は(存在する場合)/etc/bash.bashrcを介してbashセッションに含まれます。

Ubuntu 14.04

経験的証拠によると、Ubuntu 14.04のインストールでは、ファイル/ etc / bash_command_not_foundは存在しませんが、正しいファイルは/ usr / lib / command-not-foundにあるpythonスクリプトです


1
これで正しい道に進みましたが、実際のプログラムはにあるpythonスクリプトでした/usr/lib/command-not-found。私のUbuntu 14.04インストールでは、ファイル/etc/bash_command_not_foundは存在しません。
2014

おかげで、私は将来の視聴者のために私の回答にそれを追加しました
Andrew Stubbs '28

1

の場合bash、その動作はシェル関数によって制御されますcommand_not_found_handle(「man bashコマンド実行」のを参照)。

その関数で定義されている動作を確認するには、次のコマンドを発行します。

declare -p -f command_not_found_handle

command_not_found_handle関数を再定義することで、使用するプログラムを変更できます。

Ubuntu 14.04 LTSでは、デフォルトの動作はで直接定義されているようです/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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.