私は数人の友人のbashrcを調達しています。そのため、$ PATH変数に重複したエントリができてしまいます。開始に時間がかかるコマンドの問題かどうかはわかりません。$ PATHはbashで内部的にどのように機能しますか?PATHを増やすと起動時間が遅くなりますか?
私は数人の友人のbashrcを調達しています。そのため、$ PATH変数に重複したエントリができてしまいます。開始に時間がかかるコマンドの問題かどうかはわかりません。$ PATHはbashで内部的にどのように機能しますか?PATHを増やすと起動時間が遅くなりますか?
回答:
エントリを増やし$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の違い。
case :$PATH:
していないcase $PATH
ので、それはエントリーが最初か最後であっても、一致していること。
awk
次のようなものを使用して、PATH変数から重複をクリーンアップする人々を見てきました。
PATH=$(printf "%s" "$PATH" | awk -v RS=':' '!a[$1]++ { if (NR > 1) printf RS; printf $1 }')
それをあなた自身のbashrcに追加してみて、それを実行する前にどこか他のファイルを確実にソースすることができます。
別の方法は、pathmerge
ユーティリティを使用することです。
速度の問題に関しては、これはシェルの起動時間に大きな影響を与えませんが、特にコマンドがパスに見つからず、同じものを繰り返し検索する場合、コマンドのタブ補完を行う時間を節約できますそれを探しているフォルダ。
セキュリティ上の注意:あなたがすべき本当に耳を傾けるジル警告ここセキュリティについてを。別のユーザーが所有するファイルを調達することにより、シェルを起動するたびにユーザーとして独自のコードを実行するための無料パスをそれらのユーザーに提供します。パスワードでそれらのユーザーを信頼していない場合は、シェルファイルを入手しないでください。
PATH=$(echo "$PATH" | awk -v RS=':' -v ORS=":" '!a[$1]++{if (NR > 1) printf ORS; printf $a[$1]}')
:
は見た目の問題だけではありません。.
パスに追加するのと同じです。これは潜在的に危険です。
最初の一致のみ$PATH
が実行されるため、その後のエントリは処理されません。その$PATH
ため、環境内のエントリが期待どおりに動作するように、エントリの順序を時々修正する必要があります。
あなたの質問に答えるために:これは起動が遅くなる原因にはなりません。
TAB
?その場合、完全な定義が次のように見えないかどうかを確認する必要がありますcomplete -c which -a
。-a
パラメーターを削除する必要があります。次のコマンドを発行して確認できますcomplete | grep which
。