Windows 환경 변수에 해당하는 Unix가 있는지 궁금합니다 PATHEXT
.
Windows 배경이없는 사용자의 경우 : 파일 접미사를 추가하면 PATHEXT
cmd.exe에 해당 접미사를 입력하지 않고 스크립트를 실행할 수 있습니다. 예를 들어, 내 Windows 컴퓨터에서 PATHEXT에는 접미사가 포함되어 .pl
있으며 cmd.exe에서 Perl 스크립트를 실행하려면 간단히 입력 my-script
하면 실행됩니다. 그러나 bash에서 동일한 스크립트를 실행하려면 전체 이름을 작성해야합니다 my-script.pl
.
현재 Windows와 Unix에서 모두 작업하기 때문에 Unix 상자로 다시 갈 때 접미사를 입력하는 것을 잊어 버리는 함정에 빠지지 않습니다.
답변
짧음 : 아니오
길게 : 셸 스크립트에는 전체 파일 이름이 필요하지만 다양한 이름으로 명령을 참조하도록 명령의 별명을 정의 할 수 있습니다. 예를 들어
alias my-script=my-script.pl
답변
가장 간단한 해결책은 스크립트에 확장자를 사용하지 않는 것입니다. 그것들은 필요하지 않으며 스크립트 유형을 식별하는 역할을하지만 컴퓨터는 아닙니다. Windows는 파일 형식을 식별하기 위해 확장자를 사용하지만 * nix 시스템 (과 같은 예외는 거의 없음 gzip
)은 그렇지 않습니다.
바이너리는 .exe
* nix에서 확장명을 갖지 않으며 단지 이름 foo
이 아닌로 불립니다 foo.exe
. 따라서 다음과 foo.pl
같이 실행 가능 foo
하려면 먼저 파일을 저장하십시오 foo
.
또는 어떤 이유로 확장명이 실제로 필요한 경우 스크립트를 저장 한 디렉토리로 이동하여 다음을 실행하십시오.
for f in *.*; do ln -s "$f" "${f%%.*}"; done
확장명이있는 모든 파일을 반복하고 각 파일 마다을 가리키는 foo.ext
링크를 만듭니다 . 이름은 같지만 확장자가 다른 스크립트가 여러 개 있으면 실패합니다.foo
foo.ext
답변
정말로하고 싶다면 방법이 있습니다. .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
.