Ubuntu를 사용할 때 제가 좋아하는 점 중 하나는 존재하지 않는 명령을 입력하면 유사한 명령(및 유사한 명령이 포함된 패키지)을 제안한다는 것입니다.
msg
저는 Manjaro에 있는데 no 와 같이 잘못된 명령을 입력하면 mesg
반환됩니다 bash: msg: command not found
. Did you mean [similar command]
우분투에 메시지를 남기고 싶습니다 .
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>