web-dev-qa-db-ja.com

$ PATHの重複エントリは問題ですか?

私は友人のbashrcをいくつか調達しています。そのため、$ PATH変数に重複したエントリができてしまいます。それがコマンドの開始に時間がかかる問題であるかどうかはわかりません。 $ PATHはどのように内部的にbashで機能しますか? PATHSを増やすと、起動時間が遅くなりますか?

49
balki

$PATHにエントリを追加しても、直接起動が遅くなることはありませんが、シェルセッションで特定のコマンドを最初に実行するたびに遅くなります(bashはキャッシュを維持するため、コマンドを実行するたびではありません)。特に遅いファイルシステム(NFS、Samba、その他のネットワークファイルシステム、またはCygwinなど)を使用している場合を除いて、スローダウンはほとんど認識されません。

重複するエントリも$PATHを視覚的に確認するときに少し迷惑です。

重複するエントリを追加しないようにするのは簡単です。

case ":$PATH:" in
  *":$new_entry:"*) :;; # already there
  *) PATH="$new_entry:$PATH";; # or PATH="$PATH:$new_entry"
esac

補足:他の人のシェルスクリプトを調達するということは、彼が書いたコードを実行することを意味します。つまり、友だちはいつでも自分のアカウントにアクセスできるようになります。

補足:.bashrcは、$PATHまたはその他の環境変数を設定するのに適切な場所ではありません。環境変数は~/.profileで設定する必要があります。 bashで環境変数を設定するためにどのセットアップファイルを使用する必要がありますか?。bashrcと.bash_profileの違い を参照してください。

私は、人々がawkを使用してPATH変数から重複をクリーンアップし、次のようなものを見てきました。

PATH=$(printf "%s" "$PATH" | awk -v RS=':' '!a[$1]++ { if (NR > 1) printf RS; printf $1 }')

それを自分のbashrcに追加してみて、それを実行する前に他のファイルをどこかに調達していることを確認してください。

別の方法は、 the pathmerge ユーティリティを使用することです。

速度の問題については、これはシェルの起動時間に大きな影響を与えることはありませんが、特にコマンドがパスに見つからず、同じ検索を繰り返し実行する場合に、コマンドのタブ補完を実行する時間を節約できます。それを探しているフォルダ。

セキュリティに関する注意:注意する必要がある本当にGillesの警告 についてここでセキュリティ。別のユーザーが所有するファイルを調達することで、シェルを起動するたびに自分のユーザーとして自分のコードを実行するために、それらのユーザーに無料パスを提供します。これらのユーザーをパスワードで信頼していない場合は、ユーザーのShellファイルを入手するべきではありません。

31
Caleb

@Gillesの回答に基づいて、入力を最小限に抑えるために関数にラップすることができます。

function addToPATH {
  case ":$PATH:" in
    *":$1:"*) :;; # already there
    *) PATH="$1:$PATH";; # or PATH="$PATH:$1"
  esac
}

addToPATH /Applications/AIRSDK_Compiler/bin
addToPATH ~/.local/lib/npm/bin
14
hwde

$PATHの最初の一致のみが実行されるため、その後のエントリは処理されません。そのため、$PATHのエントリの順序を変更して、環境が期待どおりに動作するようにする必要がある場合があります。

あなたの質問に答えるために:これは遅い起動の原因ではないはずです。

2
Rajish