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

おすすめ記事