Windows 환경 변수 PATHEXT에 해당하는 Unix가 있습니까?


11

Windows 환경 변수에 해당하는 Unix가 있는지 궁금합니다 PATHEXT.

Windows 배경이없는 사용자의 경우 : 파일 접미사를 추가하면 PATHEXTcmd.exe에 해당 접미사를 입력하지 않고 스크립트를 실행할 수 있습니다. 예를 들어, 내 Windows 컴퓨터에서 PATHEXT에는 접미사가 포함되어 .pl있으며 cmd.exe에서 Perl 스크립트를 실행하려면 간단히 입력 my-script하면 실행됩니다. 그러나 bash에서 동일한 스크립트를 실행하려면 전체 이름을 작성해야합니다 my-script.pl.

현재 Windows와 Unix에서 모두 작업하기 때문에 Unix 상자로 다시 갈 때 접미사를 입력하는 것을 잊어 버리는 함정에 빠지지 않습니다.


PATHEXT에 .sh 및 .pl과 같은 PATHEXT가 포함되어 있고 foo.sh 및 foo.pl이있는 디렉토리에서 'foo'를 실행하려고하면 Windows가 무엇을했는지 아는 것이 흥미로울 것입니다.
Jeff Schaller

경우 .shpreceedes .pl, foo.sh실행됩니다. stackoverflow.com/a/7839178/180275
René Nyffenegger

답변:


7

짧음 : 아니오

길게 : 셸 스크립트에는 전체 파일 이름이 필요하지만 다양한 이름으로 명령을 참조하도록 명령의 별명을 정의 할 수 있습니다. 예를 들어

alias my-script=my-script.pl

12

가장 간단한 해결책은 스크립트에 확장자를 사용하지 않는 것입니다. 그것들은 필요하지 않으며 스크립트 유형을 식별하는 역할을하지만 컴퓨터는 아닙니다. Windows는 파일 형식을 식별하기 위해 확장자를 사용하지만 * nix 시스템 (과 같은 예외는 거의 없음 gzip)은 그렇지 않습니다.

바이너리는 .exe* nix에서 확장명을 갖지 않으며 단지 이름 foo이 아닌로 불립니다 foo.exe. 따라서 다음과 foo.pl같이 실행 가능 foo하려면 먼저 파일을 저장하십시오 foo.

또는 어떤 이유로 확장명이 실제로 필요한 경우 스크립트를 저장 한 디렉토리로 이동하여 다음을 실행하십시오.

for f in *.*; do ln -s "$f" "${f%%.*}"; done

확장명이있는 모든 파일을 반복하고 각 파일 마다을 가리키는 foo.ext링크를 만듭니다 . 이름은 같지만 확장자가 다른 스크립트가 여러 개 있으면 실패합니다.foofoo.ext


7

정말로하고 싶다면 방법이 있습니다. .bashrc홈 디렉토리 의 끝에 다음을 추가하고 PATHEXT점으로 구분 된 확장명으로 설정하십시오 :. (Windows 동작과 일치하도록 점을 포함하도록 변경되었습니다.) 위험을 감수하십시오.

if declare -f command_not_found_handle >/dev/null; then 
    eval "original_command_not_found_handle() $(declare -f command_not_found_handle|tail -n +2)"
fi
command_not_found_handle(){
    local PATHEXT_EXPANDED i
    IFS=: read -a PATHEXT_EXPANDED<<<"$PATHEXT"
    for i in "${PATHEXT_EXPANDED[@]}"; do
        if type "$1$i" &>/dev/null; then
            "$1$i" "${@:2}"
            return $?
        fi
    done
    if declare -f original_command_not_found_handle >/dev/null; then
        original_command_not_found_handle "$@"
    else
        return 127
    fi
}

또한로 시작하는 다른 명령이없는 경우 tab을 사용하여 명령 이름을 완성 할 수 있습니다 my-script.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.