![sh는 $PATH를 고려하지 않습니다.](https://linux55.com/image/207099/sh%EB%8A%94%20%24PATH%EB%A5%BC%20%EA%B3%A0%EB%A0%A4%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
이게 효과가 있어
sh /opt/gap-4.11.1/bin/gap.sh
이건 작동하지 않아
sh gap.sh
오류 메시지를 반환합니다.
sh: 0: Can't open gap.sh
하지만 필요한 디렉터리는 $PATH
확인된 대로 위치합니다.echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/gap-4.11.1/bin
뭐가 문제 야?
답변1
POSIX에서는 sh
구현이 현재 작업 디렉터리에서 찾을 수 없을 때 검색할 수 있도록 허용 file
하지만(사양의 기반이 되는 하위 집합) 그렇게 하기 때문에 이를 요구하지 않으며 요즘 대부분의 구현에서는 이를 요구하지 않습니다(또는 심지어). 이는 바람직하지 않습니다.$PATH
sh file
file
ksh
sh
sh
mksh
실제로 POSIX에서는 이를 허용하며 일부 구현에서는 반대 문제가 발생합니다.
sh -- "$file"
POSIX는 경로가 저장된 파일의 해석을 보장하지 않으므로 $file
다음을 수행해야 합니다.
case $file in
('') echo >&2 error;;
(*/*) sh -- "$file";;
(*) sh "./$file";;
esac
휴대용으로 해결해보세요.
이것이 사람들이 다음을 사용하는 것을 보는 이유이기도 합니다.
sh ./file
file
현재 디렉터리에서 해석되고 있는지 확인하고 현재 작업 디렉터리가 아닌 현재 작업 디렉터리에서 명령을 실행하는 것과 같이 누락된 경우 완전히 관련되지 않은 일부 스크립트를 해석하는 위험을 감수 $PATH
하지 않으려는 경우 .file
./ls
ls
$PATH
이 유틸리티에는 포함되지 않은 .
비슷한 $PATH
문제 가 있습니다 . POSIX는 sh 모드가 아닐 때 bash 또는 zsh에서 파일을 찾는 것을 허용하지 않지만 현재 디렉터리의 파일을 해석하는 폴백을 허용하지 않습니다. '에 해당 : 검색 하지 않습니다 . 에서 찾기 로 돌아갑니다 . 에서는 동작이 와 유사 합니다 .$file
/
$PATH
csh
.
source
$PATH
zsh
source
$PATH
bash
source
.
여기에서 스크립트가 에 있고 $PATH
실행 권한이 있다고 가정하면 다음과 같이 간단히 입력할 수 있습니다.
gap.sh
gap.sh
에서 찾으 려면 $PATH
. 스크립트에 shebang이 없으면 sh
POSIX 호환 인터프리터로 해석해야 합니다.
읽기 권한이 있지만 실행 권한이 없는 경우 다음을 수행할 수 있습니다.
sh -c '. gap.sh' sh arguments for gap.sh
$PATH
위에 표시된 대로 조회가 수행됩니다 .
역사적으로 on 이 ksh file
먼저 검색 ksh
되었습니다 $PATH
. 이는 setuid 스크립트를 지원하는 시스템의 보안 취약점입니다. 다음과 같이 할 수 있습니다.
ln -s /path/to/some/setuid/ksh/script /tmp/file
echo sh > ~/bin/file
PATH=$PATH:~/bin
cd /tmp
exec("file", ...)
shebang으로 which를 호출하면 setuid 사용자로 실행 #! /bin/ksh -
되고 대신 해석되므로 스크립트가 setuid 루트인 경우 루트 쉘을 얻게 됩니다./bin/ksh - file
ksh
~/bin/file
/tmp/file
답변2
PATH
이 예에서는 실행 중인 프로그램을 고려합니다 sh
.
/bin:/opt/gap-4.11.1/bin
귀하의 경우와 마찬가지로 PATH
"직접" 실행할 수 있어야 합니다. 다음을 실행하십시오.
gap.sh
실행 권한이 있는 한.