우분투에서 "명령을 찾을 수 없음"처리기에 연결


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를 활성화하고 싶습니다.

해킹은 어디서 시작해야합니까?


답변:


8

일반적으로

리눅스 저널은 꽤 좋은 기사를 가지고 :

bash의 맨 페이지에서 :

... PATH에서 디렉토리의 전체 검색은 명령이 해시 테이블에없는 경우에만 수행됩니다. 검색에 실패하면 쉘은 command_not_found_handle이라는 정의 된 쉘 함수를 검색합니다. 해당 함수가 존재하면 원래 명령과 원래 명령의 인수를 인수로 사용하여 호출되며 함수의 종료 상태는 쉘의 종료 상태가됩니다. 해당 함수가 정의되어 있지 않으면 쉘은 오류 메시지를 인쇄하고 종료 상태 127을 리턴합니다.

/ etc의 빠른 grep이 발생한 위치를 발견했습니다. 함수 자체는 / etc / bash_command_not_found에 있으며 해당 함수는 /etc/bash.bashrc를 통해 bash 세션에 포함됩니다 (있는 경우).

우분투 14.04

경험적 증거에 따르면 Ubuntu 14.04 설치시 / etc / bash_command_not_found 파일이 존재하지 않지만 올바른 파일은 / usr / lib / command-not-found에 있는 python 스크립트입니다.


1
이것은 나를 올바른 길로 안내했지만 실제 프로그램은에있는 파이썬 스크립트였습니다 /usr/lib/command-not-found. Ubuntu 14.04 설치에서 파일 /etc/bash_command_not_found이 존재하지 않습니다.
wim

감사합니다. 다음 시청자에 대한 답변에 추가했습니다.
Andrew Stubbs

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.