Arch Linux에서도 유사한 명령이 제안됩니다.

Arch Linux에서도 유사한 명령이 제안됩니다.

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.

속도

  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>

작업 예시 스크린샷

관련 정보