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
どのプログラムもこれを読まないことに注意してください。これは~/.bashrc
bashの対話型インスタンスの設定ファイルです。~/.bashrc
環境変数を定義する正しい場所は定義しないでくださいPATH
(~/.profile
または~/.bash_profile
bash以外のシェルに興味がない場合)。バラよりこれらの違いは何ですか?どちらを使うべきですか?
/etc/environment
またはに入れないでください。これはシェルファイルではないため、代替は使用~/.pam_environment
できません。$PATH
これらのファイルでは変数を上書きすることができ、追加することはできません。
一部のシステムスクリプトの潜在的な複雑さ
変数がすでに環境にある場合は必要ありませんexport
。変数値に対するすべての変更が環境に反映されます。PATH
ほぼ常に環境では、すべてのUNIXシステムはこれを最初に設定します(実際には通常最初のプロセスで)。
PATH
ログイン時にすでに環境にあり、含まれているいくつかのシステムディレクトリを使用できます。ある種の仮想環境を設定するときに事前に実行できるスクリプトを作成する場合は、スクリプトが空でなくエクスポートされていることを確認しPATH
たい場合があります。PATH
まだ設定されていない場合は、次のようになりますPATH=$PATH:/some/directory
。PATH
に設定します:/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/sh
export
~
割り当てを除いて、単語の先頭でのみ解析されます(参照どのUnixコマンドで見つかったホームディレクトリパスを追加するには?もっと学ぶ);$PATH
外部二重引用符PATH
スペースが含まれている場合は中断または\[*?
。
したがって、ダッシュなどのシェルでは、リテラル文字列と最初のスペースまでの値に
設定されます。 (素手で働く)export PATH=~/opt/bin:$PATH
PATH
~/opt/bin/:
PATH
PATH=~/opt/bin:$PATH
見積もりは必要ありません。そして正しいことをしてください。を作成したり、export
移植可能なスクリプトで使用したい場合(またはチルダ拡張を許可せずに実行するBourneシェルへの移植性のため)が必要です。export PATH="$HOME/opt/bin:$PATH"
PATH=~/opt/bin:$PATH; export PATH
PATH=$HOME/opt/bin:$PATH; export PATH
export var=value
1 Bourneシェルではそうではありませんでしたが(現代のPOSIXスタイルのシェルではなく実際のBourneシェルのように)、最近ではこの古いシェルに遭遇する可能性が低くなります。
答え2
追加/フロント追加への防弾アプローチ
一般的な追加/プレフィックス方法
PATH="$PATH:~/opt/bin" # appending
PATH="~/opt/bin:$PATH" # prepending
重度の頭痛を引き起こす可能性があります。
これ防弾方式~/opt/bin
PATH環境変数にパス(たとえば)を追加します。
PATH="${PATH:+${PATH}:}~/opt/bin" # appending
PATH="~/opt/bin${PATH:+:${PATH}}" # prepending
なぜ?
$PATH
これにより、最初に空のときに望ましくない副作用が発生する可能性がある偽の前後のコロンを防ぐことができます。悪夢になることもある、見つけるのは難しいです(この回答このイベントを簡単に処理してくださいawk
)。
説明する(からシェルパラメータ拡張):
${parameter:+word}
null または設定されていない場合は何も置き換えられず、そうでない場合は
parameter
拡張が置き換えられます。word
したがって、${PATH:+${PATH}:}
次のように拡張されます。
- 空または設定されていない場合は何もありません
PATH
。 ${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
変数をエクスポートする必要があることです。
追加情報ここ