Arch Linuxでも同様のコマンドが提案されています。

Arch Linuxでも同様のコマンドが提案されています。

Ubuntuを使用するときの私の好きなことの1つは、存在しないコマンドを入力すると、同様のコマンド(および同様のコマンドを含むパッケージ)を提案することです。

msg私はManjaroにいますが、noなどの誤ったコマンドを入力するとmesg返されますbash: msg: command not foundDid you mean [similar command]Ubuntuにメッセージを残したいです。

Arch Linuxで同様のコマンドの提案を受け取る方法はありますか?

答え1

をインストールpacman -S pkgfileして実行しsudo pkgfile --update、次に追加できます~/.bashrc

source /usr/share/doc/pkgfile/command-not-found.bash

~からアーチスウィキ:

その後、使用できないコマンドを実行しようとすると、次のメッセージが表示されます。

$アビワード

abiword は次のパッケージにあります: extra/abiword 3.0.1-2 /usr/bin/abiword

ただし、同様のコマンドは検索されません。

そしてAURコマンドパッケージが見つかりませんより多くを約束しますが、現在は廃止されているとマークされています。 github(https://github.com/metti/command-not-found)。

答え2

現在、Arch Linuxでこの機能を実装するために使用できるパッケージが見つからなかったため、同じソリューションを作成しようとしました。

PROMPT_COMMANDこのソリューションではsum変数を利用しますcompgen

スピード

  1. 次の内容でPythonファイルを作成します。私はそれを名付けたtemp.py
#!/usr/bin/env python
import sys

def similar_words(word):
    """
    return a set with spelling1 distance alternative spellings

    based on http://norvig.com/spell-correct.html
    """
    alphabet = 'abcdefghijklmnopqrstuvwxyz-_0123456789'
    s = [(word[:i], word[i:]) for i in range(len(word) + 1)]
    deletes = [a + b[1:] for a, b in s if b]
    transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b) > 1]
    replaces = [a + c + b[1:] for a, b in s for c in alphabet if b]
    inserts = [a + c + b     for a, b in s for c in alphabet]
    return set(deletes + transposes + replaces + inserts)

def bash_command(cmd):
    import subprocess
    sp = subprocess.Popen(['/bin/bash', '-c', cmd], stdout=subprocess.PIPE)
    return [s.decode('utf-8').strip() for s in sp.stdout.readlines()]

def main():
    word = sys.argv[1]
    command_list = bash_command('compgen -ck')
    result = list(set(similar_words(word)).intersection(set(command_list)))

    if len(result) > 0:
        wrong_command_str = "Did you mean?"
        indent = len(wrong_command_str)//2

        print("Did you mean?")
        for cmd in result:
            print(indent*" ",cmd)

if __name__ == '__main__':
    main()
  1. Pythonスクリプトを$PROMPT_COMMAND変数に追加します。
export PROMPT_COMMAND='if [ $? -gt 0 ]; then python test.py $(fc -nl | tail -n 1 | awk "{print $1}"); fi;'$PROMPT_COMMAND
  1. 前のコマンドが失敗したことを確認してください。$? -gt 0
  2. 失敗した場合はコマンド名を取得します。fc -nl | tail -n 1 | awk "{print $1}"
  3. Pythonスクリプトを使用して同様の一致を見つけます。python test.py <command-name>

タスク例のスクリーンショット

関連情報