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

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

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

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

나는 현재 Windows와 Unix 모두에서 작업하고 있기 때문에 Unix 시스템으로 돌아갈 때 접미사 입력을 잊어버리는 함정에 거의 항상 빠지게 됩니다.

답변1

가장 간단한 해결책은 스크립트 확장을 사용하지 않는 것입니다. 필수 사항은 아니며 컴퓨터가 아닌 사용자에게 스크립트 유형을 식별하는 데에만 사용됩니다. Windows는 확장자를 사용하여 파일 유형을 식별하지만 *nix 시스템(예: 드문 경우 제외 gzip)은 사용하지 않습니다.

바이너리 파일은 *nix 에 .exe확장자가 없고 단지 호출 foo된다는 점에 유의하세요 foo.exe. 따라서 foo.pl실행 파일을 원하면 foo파일을 먼저 저장하십시오.foo

또는 어떤 이유로든 확장 기능이 꼭 필요한 경우 스크립트를 저장한 디렉터리로 이동하여 다음 명령을 실행하세요.

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

이는 확장자를 가진 모든 파일에 대해 반복되며, 그 안의 각 파일에 대해 을 가리키는 foo.ext이름의 링크가 생성됩니다 . 이름은 같지만 확장자가 다른 스크립트가 여러 개 있는 경우 이 작업은 실패합니다.foofoo.ext

답변2

정말로 하고 싶다면 방법이 있다. .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.

답변3

짧은: 없음

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

alias my-script=my-script.pl

관련 정보