PATHでスクリプトと同じ名前のコマンドを検索してください。

PATHでスクリプトと同じ名前のコマンドを検索してください。

たとえば、私のスクリプトはです。同じ名前の実行可能ファイルを$HOME/bin/sudo検索して実行したいのですが、スクリプト自体はそうでなければ無限ループに陥ります!$PATHsudo$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...

  • -pPATHのデフォルト値を使用してコマンド検索が実行されるため、すべての標準ユーティリティを見つけることができます。

解析可能または人間に優しい-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

関連情報