同じパスを複数回追加しなくても、システム全体または個々のユーザーのために$ 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/profile
Red 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