$PATHにきれいに追加するには?

$PATHにきれいに追加するには?

同じパスを複数回追加しなくても、システム全体または個々のユーザーのために$ PATHにエントリを追加する方法が必要です。

これを望む理由の1つは、ログインを必要としないものに追加することができ、呼び出しを行わない.bashrc(たとえば)を使用するシステムでより便利です。lightdm.profile

私は問題について知っています重複を消去する方法$PATHでは、しかし重複したアイテムを削除したくありません。。私は方法が欲しいパスがまだ存在しない場合にのみパスを追加してください。

答え1

追加する新しいパスは次のとおりです。

new=/opt/bin

newその後、POSIXシェルを使用してすでにパスにあることをテストし、そうでない場合は追加できます。

case ":${PATH:=$new}:" in
    *:"$new":*)  ;;
    *) PATH="$new:$PATH"  ;;
esac

コロンの使用に注意してください。コロンがない場合は、new=/binパターンが同じであるため、すでにパスにあると想定できます/usr/bin。 PATHには通常多くの要素がありますが、PATHの要素が0個と1個の特殊な場合も処理されます。 PATHに最初に要素がない場合(空)、空の場合は${PATH:=$new}それを使用してPATH処理されます$new。このようにパラメータのデフォルト値を設定することは、すべてのPOSIXシェルの機能です。セクション2.6.2を参照してください。POSIX ドキュメント.)

呼び出し可能関数

便宜上、上記のコードを関数に入れることができます。この関数はコマンドラインで定義でき、永続的に使用するにはシェルのinitスクリプトに入れます(bashユーザーの場合は次のようになります~/.bashrc)。

pupdate() { case ":${PATH:=$1}:" in *:"$1":*) ;; *) PATH="$1:$PATH" ;; esac; }

このパス更新機能を使用して現在のPATHにディレクトリを追加するには:

pupdate /new/path

答え2

/etc/profile.dたとえば、mypath.sh(または必要に応じて)というファイルを作成します。 lightdmを使用している場合は利用可能であることを確認し、そうでない場合は同じファイルを使用するか、/etc/bashrcそのファイルから始めてください。次の機能を追加します。

checkPath () {
        case ":$PATH:" in
                *":$1:"*) return 1
                        ;;
        esac
        return 0;
}

# Prepend to $PATH
prependToPath () {
        for a; do
                checkPath $a
                if [ $? -eq 0 ]; then
                        PATH=$a:$PATH
                fi
        done
        export PATH
}

# Append to $PATH
appendToPath () {
        for a; do
                checkPath $a
                if [ $? -eq 0 ]; then
                        PATH=$PATH:$a
                fi
        done
        export PATH
}

$PATH の先頭(前に追加)内容がその後の内容より優先され、逆に終了(追加)内容が前の内容に置き換えられます。つまり、$ PATHがあり、/usr/local/bin:/usr/bin両方のディレクトリに実行可能ファイルがある場合、デフォルトではgotchaそのディレクトリの実行可能ファイルが使用されます。/usr/local/bin

これで、同じファイル、異なるシェル構成ファイル、またはコマンドラインで使用できるようになります。

appendToPath /some/path /another/path
prependToPath /some/path /yet/another/path

にある場合は、.bashrc新しいシェルを起動したときに値が複数回表示されるのを防ぎます。制限があります。事前に追加されたコンテンツを追加したり(たとえば、$ PATH内でパスを移動したり)、その逆をしたい場合は、これを直接行う必要があります。

答え3

次のことができます。

echo $PATH | grep /my/bin >/dev/null || PATH=$PATH:/my/bin

注:他の変数からPATHを構築する場合は、多くのシェルが ""を "."と解釈するため、その変数が空でないことを確認してください。

答え4

~/.profile私は長年さまざまなファイルにこの小さな機能を持ってきました。/etc/profileRed Hat Linuxおよびその派生製品(CentOS、Fedora)に存在します。

pathmunge () {
        if ! echo $PATH | /bin/grep -Eq "(^|:)$1($|:)" ; then
           if [ "$2" = "after" ] ; then
              PATH=$PATH:$1
           else
              PATH=$1:$PATH
           fi
        fi
}

したがって、次のディレクトリの先頭に新しいディレクトリを追加しますPATH

pathmunge /new/path

最後まで:

pathmunge /new/path after

関連情報