예를 들어, 내 스크립트는 입니다 . 동일한 이름을 가진 실행 파일을 $HOME/bin/sudo
검색하여 실행하고 싶지만 스크립트 자체는 그렇지 않으면 무한 루프에 빠지게 됩니다!$PATH
sudo
$HOME/bin/sudo
편집: 요점은 어떤 경우에는 대체 스크립트가 일반 시스템 명령보다 더 높은 우선순위를 갖기를 원하고 어떤 경우에는 그 반대를 원한다는 것입니다. 따라서 "$HOME/bin"을 경로의 첫 번째로 설정했으므로 이제 각 명령의 우선순위를 개별적으로 정의할 수 있습니다. 나는 또한 스크립트가 다른 시스템에서 실행될 수 있도록 일종의 "이식성"을 원합니다.
답변1
스크립트나 기능이 필요하지 않습니다. $HOME/bin
경로에 마지막 항목을 넣으면 다음과 같은 경우에만 작동합니다 $PATH
.
예:
[jenny@sameen ~]$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin
[jenny@sameen ~]$ which foo
/usr/bin/which: no foo in (/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin)
[jenny@sameen ~]$ export PATH=$PATH:$HOME/bin
[jenny@sameen ~]$ which foo
~/bin/foo
[jenny@sameen ~]$ sudo cp bin/foo /usr/local/bin/
[jenny@sameen ~]$ which foo
/usr/local/bin/foo
자신만의 $PATH를 설정하여 스크립트 내에서 확인하고 싶은 경우 다음 예를 참조하세요.
#!/bin/bash
export ORIGPATH=$PATH # to revert the path after checking for the binary
export PATH=`echo $PATH |sed -e 's{/home/jenny/bin:{{'`
MYNAME=`basename $0`
if which $MYNAME
then
BINFILE=`which $MYNAME`
export PATH=$ORIGPATH
echo "Found $MYNAME in $BINFILE "
$BINFILE
else
export PATH=$ORIGPATH
echo "Here goes the rest of the script"
fi
답변2
POSIX는 -p
내장 옵션을 정의합니다 command
...
-p
PATH의 기본값을 사용하여 명령 검색이 수행되므로 모든 표준 유틸리티를 찾을 수 있습니다.
구문 분석 가능하거나 인간 친화적 -v
인 옵션과 함께 사용됩니다.-V
(각기)의 위치 에 대한 정보를 출력하며 command
, 요청할 때 기대되는 유틸리티를 얻기 위해 이에 매우 의존할 수 있습니다. 다음은 작동 방식을 보여주는 작은 스크립트입니다.
( cd ~; mkdir -p bin
cat >./bin/cat
chmod +x ./bin/cat
export "PATH=$HOME/bin:$PATH"
command -V cat | cat
) <<\NOTCAT
#!/bin/sh
command -p cat
! printf "I'm not REALLY cat, but '%s' is!\n" \
"$(command -pv cat)"
NOTCAT
산출
cat is /home/mikeserv/bin/cat
I'm not REALLY cat, but '/bin/cat' is!
처음 몇 개의 명령문은 ~/bin/cat에 실행 가능한 스크립트를 작성합니다. 머리에도 $PATH
삽입되도록 수정되었습니다 .~/bin
그래서 command -V cat | cat
command
내가 가짜 cat
의 stdin에 쓸 때. 그러나 그 출력은 여전히 내 화면에 나타납니다. command -p cat
왜냐하면 내가 아무리 내 것을 파괴해도 마찬가지 이기 때문이다 $PATH
.
답변3
수정된 명령을 검색합니다 PATH
.
PATH=$(awk -F: 'sub(FS "'$HOME/bin'","")' <<<"$PATH") which sudo
예를 들어:
$ which sudo
/usr/local/bin/sudo
$ PATH=$(awk -F: 'sub(FS "/usr/local/bin","")' <<<"$PATH") which sudo
/usr/bin/sudo
답변4
$HOME/bin 경로가 $PATH에 없으면 다음 명령을 사용하여 테스트할 수 있습니다.
if [ ! -a $(command -v $(basename $0)) ]; then
YOUR SCRIPT
else
echo "$(basename $0 already exists in $PATH"
fi