たとえば、私のスクリプトはです。同じ名前の実行可能ファイルを$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