Ubuntuを使用するときの私の好きなことの1つは、存在しないコマンドを入力すると、同様のコマンド(および同様のコマンドを含むパッケージ)を提案することです。
msg
私はManjaroにいますが、noなどの誤ったコマンドを入力するとmesg
返されますbash: msg: command not found
。Did 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
。
スピード
- 次の内容で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()
- Pythonスクリプトを
$PROMPT_COMMAND
変数に追加します。
export PROMPT_COMMAND='if [ $? -gt 0 ]; then python test.py $(fc -nl | tail -n 1 | awk "{print $1}"); fi;'$PROMPT_COMMAND
- 前のコマンドが失敗したことを確認してください。
$? -gt 0
- 失敗した場合はコマンド名を取得します。
fc -nl | tail -n 1 | awk "{print $1}"
- Pythonスクリプトを使用して同様の一致を見つけます。
python test.py <command-name>