PATHにパスを正しく追加するには?

PATHにパスを正しく追加するには?

PATH環境変数に新しいパスを追加する必要があることを知りたいです。たとえば、エディタでこれを行うことができることを知っていますが、これを.bashrc行う方法は明確ではありません。

この方法:

export PATH=~/opt/bin:$PATH

それともこれ?

export PATH=$PATH:~/opt/bin

答え1

何か簡単なもの

PATH=$PATH:~/opt/bin

または

PATH=~/opt/bin:$PATH

~/opt/bin最後に追加するか(同じ名前のプログラムが複数のディレクトリにある場合は他のすべてのディレクトリの後に検索)、または最初に追加するか(他のすべてのディレクトリの前に検索)によって異なります。

同時に複数の項目を追加できます。PATH=$PATH:~/opt/bin:~/opt/node/binあるいは、バリアントを注文するのも良いでしょう。export複雑さが増すため、行の先頭に置かないでください(下記の「bash以外のシェルに関する注意事項」を参照)。

プロジェクトがさまざまなコンポーネントで構成されている場合、重複した項目が発生する可能性PATHがあります。バラよりどのUnixコマンドで見つかったホームディレクトリパスを追加するには?そしてawkコマンドを使用して重複した$PATHエントリを削除する重複項目を追加または削除しない場合

~/binところで、一部のディストリビューションではそれをPATHに自動的に入れます。

どこに置くか

変更したい行をPATH~/.profileまたはまたは~/.bash_profileに配置します(存在する場合)。 (ログインシェルがbashではなくzshの場合は入れてください~/.zprofile。)

構成ファイルはログインシェルから読み取られるため、次回のログイン時にのみ適用されます。 (一部のシステムでは、ログインシェルを読み取るように端末を設定します。この場合は新しい端末ウィンドウを起動できますが、設定は適用されます。)端末を介して実行されたプログラムにのみ適用され、PATHすべてのプログラムを設定する方法はシステムによって異なります。 。 )

~/.bash_rcどのプログラムもこれを読まないことに注意してください。これは~/.bashrcbashの対話型インスタンスの設定ファイルです。~/.bashrc環境変数を定義する正しい場所は定義しないでくださいPATH~/.profileまたは~/.bash_profilebash以外のシェルに興味がない場合)。バラよりこれらの違いは何ですか?どちらを使うべきですか?

/etc/environmentまたはに入れないでください。これはシェルファイルではないため、代替は使用~/.pam_environmentできません。$PATHこれらのファイルでは変数を上書きすることができ、追加することはできません。

一部のシステムスクリプトの潜在的な複雑さ

変数がすでに環境にある場合は必要ありませんexport。変数値に対するすべての変更が環境に反映されます。PATHほぼ常に環境では、すべてのUNIXシステムはこれを最初に設定します(実際には通常最初のプロセスで)。

PATHログイン時にすでに環境にあり、含まれているいくつかのシステムディレクトリを使用できます。ある種の仮想環境を設定するときに事前に実行できるスクリプトを作成する場合は、スクリプトが空でなくエクスポートされていることを確認しPATHたい場合があります。PATHまだ設定されていない場合は、次のようになりますPATH=$PATH:/some/directoryPATHに設定します:/some/directory。先頭の空のコンポーネントは現在のディレクトリ( like .:/some/directory)を表します。

if [ -z "${PATH-}" ]; then export PATH=/usr/local/bin:/usr/bin:/bin; fi

Bash以外のシェルに関する注意

bash、ksh、zshではexport構文は特別で、両方とも正しい操作をPATH=~/opt/bin:$PATH行います。ダッシュ(多くのシステムexport PATH=~/opt/bin:$PATHで)などの他のBourne / POSIXスタイルのシェルは通常のコマンドで解析されます。これは2つの違いを意味します。/bin/shexport

したがって、ダッシュなどのシェルでは、リテラル文字列と最初のスペースまでの値に export PATH=~/opt/bin:$PATH設定されます。 (素手で働く)PATH~/opt/bin/:PATHPATH=~/opt/bin:$PATH見積もりは必要ありません。そして正しいことをしてください。を作成したり、export移植可能なスクリプトで使用したい場合(またはチルダ拡張を許可せずに実行するBourneシェルへの移植性のため)が必要です。export PATH="$HOME/opt/bin:$PATH"PATH=~/opt/bin:$PATH; export PATHPATH=$HOME/opt/bin:$PATH; export PATHexport var=value

1 Bourneシェルではそうではありませんでしたが(現代のPOSIXスタイルのシェルではなく実際のBourneシェルのように)、最近ではこの古いシェルに遭遇する可能性が低くなります。

答え2

追加/フロント追加への防弾アプローチ

一般的な追加/プレフィックス方法

PATH="$PATH:~/opt/bin"   # appending
PATH="~/opt/bin:$PATH"   # prepending

重度の頭痛を引き起こす可能性があります。

これ防弾方式~/opt/binPATH環境変数にパス(たとえば)を追加します。

PATH="${PATH:+${PATH}:}~/opt/bin"   # appending
PATH="~/opt/bin${PATH:+:${PATH}}"   # prepending

なぜ?

$PATHこれにより、最初に空のときに望ましくない副作用が発生する可能性がある偽の前後のコロンを防ぐことができます。悪夢になることもある、見つけるのは難しいです(この回答このイベントを簡単に処理してくださいawk)。

説明する(からシェルパラメータ拡張):

${parameter:+word}

null または設定されていない場合は何も置き換えられず、そうでない場合はparameter拡張が置き換えられます。word

したがって、${PATH:+${PATH}:}次のように拡張されます。

  1. 空または設定されていない場合は何もありませんPATH
  2. ${PATH}:PATH設定されている場合。

ノート:これはbash用です。


なぜシステムスクリプトが一般的に使用しないのだろうか。 編集する:私はこのようなスクリプトがdevtoolset-6/enable実際にこれを使用していることを発見しました。

$ cat /opt/rh/devtoolset-6/enable
# General environment variables
export PATH=/opt/rh/devtoolset-6/root/usr/bin${PATH:+:${PATH}}
...

答え3

どちらも機能しますが、同じことはしません。つまり、要素はPATH左から右に確認されます。最初の例では、実行可能~/opt/binファイルがインストールされている実行可能ファイル/usr/binより優先順位が高くなります(たとえば、必要なものでもそうでない場合もあります)。

特に、前にパスを追加することはセキュリティの観点から危険です。なぜなら、誰かがあなたのパスへの書き込み権限を持っているなら、そこに~/opt/bin別のパスを追加することができ、lsあなたはそれを/bin/ls誤って使用する可能性があるからです。ブラウザや選択肢が同じであると想像してみてくださいssh。 (パスに.を入れる場合も同様です。)

答え4

Linuxは環境変数を介して実行可能ファイルの検索パスを決定します$PATH。 /data/myscripts ディレクトリを環境変数の先頭に追加するには、$PATH次のコマンドを使用します。

PATH=/data/myscripts:$PATH

パスの末尾にディレクトリを追加するには、次のコマンドを使用します。

PATH=$PATH:/data/myscripts

しかし、以前の内容だけでは十分ではありません。スクリプト内で環境変数を設定すると、変更はスクリプト内でのみ適用されるためです。この制限を解決する方法は2つだけです。

  • スクリプトから環境変数をエクスポートすると、環境変数はスクリプトから呼び出されるすべてのプログラムで有効です。スクリプトを呼び出すプログラム内では何の効果もありません。
  • スクリプトを呼び出すプログラムが呼び出しではなくインクルードを介してスクリプトを呼び出す場合、スクリプトのすべての環境変更が呼び出しプログラムに適用されます。これは、dotコマンドまたはsourceコマンドを使用して実行できます。

例:

$HOME/myscript.sh
source $HOME/myscript.sh

インクルードはデフォルトで「呼び出し」スクリプトを「呼び出し」スクリプトにマージします。 Cの#includeと同じです。したがって、「呼び出し」スクリプトまたはプログラム内で動作します。しかし、もちろん、呼び出しプログラムが呼び出すプログラムやスクリプトには何の影響もありません。呼び出しチェーン全体で有効な状態を維持するには、エクスポートコマンドを使用して環境変数の設定を尊重する必要があります。

たとえば、bash シェルプログラムはインクルードを介して .bash_profile ファイルの内容をマージします。 .bash_profileに次の2行を入力してください。

PATH=$PATH:/data/myscripts
export PATH

これらの2行のコードをbashプログラムに効果的に置きます。したがって、bashには$ PATH変数が含まれており、$HOME/myscript.shエクスポートステートメントのためにbashが呼び出すすべてのプログラムには変更された$PATH変数があります。 bash プロンプトで実行されるすべてのプログラムは bash によって呼び出されるため、新しいパスは bash プロンプトで実行されるすべてのプログラムに有効です。

最も重要なのは、パスに新しいディレクトリを追加するには、シェルに含まれるスクリプト内の$ PATH環境変数にディレクトリを追加または追加し、環境$PATH変数をエクスポートする必要があることです。

追加情報ここ

関連情報