bash가 선행 `:`이 있을 때 이를 무시하도록 할 수 있나요?

bash가 선행 `:`이 있을 때 이를 무시하도록 할 수 있나요?

일반적으로 bash(macOS)에서 작업하는 경우 (Mac)Vim에서도 작업하며 둘 사이를 전환합니다. Vim에서 터미널로 전환한 후 제가 흔히 범하는 실수는 명령 앞에 콜론을 넣는 것입니다. 저는 :cd /path/to/project/dir/Vim에 있는 다음 터미널로 전환하여 똑같은 것을 입력할 것입니다. 단, 물론 거기에서 콜론으로 시작해서는 안 됩니다.

그래서 bash 명령이 언제 실행되는지 모르겠습니다.~해야 한다콜론으로 시작하고 매번일부러 그런 건 아니었어요. 그렇다면 bash가 콜론(명령의 첫 번째 문자인 경우)을 완전히 무시하고 다음 :cd ...과 같이 해석하도록 하는 방법이 있습니까 cd ...?

답변1

bash(1)command_not_found_handle()이 함수는 정의되어 있고 실행할 명령을 찾을 수 없는 경우 호출됩니다. 이 기능을 아직 사용하지 않은 경우(예: Ubuntu의 command-not-found 패키지) 이 기능을 사용하여 콜론을 제거하고 다시 시도할 수 있습니다.

command_not_found_handle() {
    if [[ "${1:0:1}" != : ]]; then
        printf "%s: %s: command not found\n" "$0" "$1" >&2
        return 127
    else
        "${1/#:}" "${@:2}"
    fi
}

해당 기능을 .bashrc.

편집: 여기에는 흔하지 않은 확장 기능이 있으므로 조금 더 설명하겠습니다.

첫째, 주석에서 지적했듯이 command_not_found_handle이것은 bash 4 기능입니다. Bash 4는 2009년 2월에 출시되었습니다. command_not_found_handle이 함수는 찾을 수 없는 명령과 명령의 매개변수를 사용하여 호출됩니다. 즉, $1찾을 수 없는 명령이고 $2그 뒤에 찾을 수 없는 명령의 매개변수가 있습니다. 이에 대해서는 아래에 설명되어 있습니다.명령 실행맨 페이지에서.

"${1:0:1}"위치 0 에서 시작하는 길이 1 의 하위 문자열로 시작하는 확장입니다 $1. 즉, 찾을 수 없는 명령이 $1있는 첫 번째 문자를 추출합니다. $1이 내용은 다음과 같이 기록됩니다.매개변수 확장매뉴얼 페이지에서는 ${parameter:offset:length}.

의 첫 번째 문자가 $1콜론이 아니면 오류를 인쇄하고 종료 값 127을 반환합니다. 127은 아래와 같이 bash가 실행할 명령을 찾을 수 없을 때 사용하는 종료 코드입니다.명령 실행맨 페이지에서.

"${1/#:}"$1선행 콜론을 확장 하고 제거합니다. 처음에 콜론이 없으면 Normal 과 동일 $1하지만, 우리가 처한 조건의 분기 때문에 어쨌든 콜론으로 시작한다는 것을 알 수 있습니다. 이 확장은 다음에 문서화되어 있습니다.매개변수 확장매뉴얼 페이지에서 ${parameter/pattern/string}.

"${@:2}"두 번째 매개변수부터 시작하는 위치 매개변수로 확장됩니다. 이 확장은 다음에 문서화되어 있습니다.매개변수 확장배열 ${parameter:offset}@. 즉, 하위 문자열을 추출하는 대신 배열의 요소로 확장됩니다.

최종 결과는 찾을 수 없는 명령이 실행되고 명령에 앞에 콜론이 있는 경우 콜론을 제거하여 새 명령을 형성하고 원래 인수를 새 명령에 전달한다는 것입니다. 이는 명령을 실행하려는 두 번째 시도가 발견되지 않으면 command_not_found_handle()다시 실행되는 것처럼 궁극적으로 재귀적으로 작동합니다. 이는 실행할 수 :::mkdir있고 계속 실행될 것임을 의미합니다 mkdir.

관련 정보