ディレクトリのすべてのサブディレクトリを$ PATHに設定するにはどうすればよいですか?


38

ディレクトリを$ PATHに追加すると、そのサブディレクトリは再帰的に追加されないようです。それで私はそれができますか?または、これがサポートされていない理由はありますか?


5
いったいなぜそれが必要なのですか?
アレックス

10
@alex:なぜ必要がないと思いますか?
ティム

4
@Timが「一般に」サポートされていない理由は、セキュリティリスクであり、通常は必要ないためです。何が行き詰まるかを知っているディレクトリを再帰的にパスに追加すると、監査が非常に難しくなります。
xenoterracide

4
@ティム:それは本当に驚くべき珍しいことです、それが理由です。
アレックス

8
@alex binディレクトリのサブディレクトリはどうですか?スクリプトをbinフォルダーのディレクトリに整理したいと思います。
アンディ

回答:


19

次のようなfindを使用して再帰的に追加します。

PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )

警告:質問へのコメントで述べたように、追加されたディレクトリ内の実行可能ファイルが悪意がないという保証がないため、セキュリティリスクが生じるため、これは推奨されません。

おそらく、Gillesの答えに従い、stowを使用する方が良いソリューションです


6
警告:この答えは技術的には正しいですが、alexとxenoterracideが注意するように、これは非常に安全ではないことであり、実際にこれを使用する前に必ずよく考えてください。
カレブ

2
これが実際に行うのに安全で安全なことではない理由について、あなたの答えに警告を追加してください。
カレブ

3
特に危険だとは思わない。ランダムなディレクトリを追加すること$PATHは危険ですが、サブディレクトリを追加することはそれほど悪くありません。しかし、通常は役に立たず、おそらく非効率的です(場合によっては、環境のサイズ制限に追い込まれることさえあります)。
ジル「SO-悪であるのをやめる」

3
@カレブ:おそらくクレイジーですが、なぜ安全ではないのですか?誰かが悪意のある実行可能ファイルをサブディレクトリに追加するアクセス権を持っている場合、それらは親ディレクトリ(つまり、~/binまたは~/scripts)にも追加できるため、セキュリティは同じです。
メストレリオン

2
ランダムな人が悪意のあるファイルをに追加できる環境で作業している場合のセキュリティリスク~/scripts。私はしませんし、誰もする必要があります
-oseiskar

21

通常のUNIXディレクトリ構造には、種類ごとにディレクトリに分類されたアプリケーションファイルがあります。bin実行可能ファイル、libライブラリ、docドキュメントなどです。それらが別々のディレクトリにインストールされるときです。多くの場合、アプリケーションはいくつかのディレクトリにグループ化されます(多くのシステムでは、$PATH/usr/local/bin/usr/binおよびに3つのディレクトリしかありません/bin)。ディレクトリ内に実行可能ファイルとサブディレクトリの両方があることはめったにないため、ディレクトリのサブディレクトリをに含める必要はありません$PATH

時折役に立つのは、指定されたbinディレクトリのサブディレクトリのすべてのサブディレクトリを以下に含めることです$PATH

for d in /opt/*/bin; do PATH="$PATH:$d"; done

ただし、これはめったに行われません。非標準ディレクトリ内の実行可能ファイルを配置する通常の方法$PATHは、などのパス内のディレクトリにシンボリックリンクを作成すること/usr/local/binです。この点でstowユーティリティ(またはxstow)が役立ちます。


4

これがサポートされていない理由の1つは、bin /(および同様の)ディレクトリがシンボリックリンクを使用して、プログラムの実際の実行可能ファイルがインストールされている特定のディレクトリを指すためです。

したがって、$PATHインクルード/usr/local/bin(ほとんどの場合)には、そのフォルダーrubyに、Rubyを実行するコードが見つかった特定のディレクトリを指すシンボリックリンク(など)がいっぱいです(など../Cellar/ruby/2.1.3/bin/ruby)。

これが、各実行可能ファイルのフォルダをで指定する必要がない理由です$PATH。bin /タイプディレクトリに通常見られるシンボリックリンクがそれを処理します。


1

zshの、$ PATHは配列として追加することができます。シェルグロビングを使用して、複数のサブディレクトリを$ PATH配列に追加できます。

例:

.zshrc

typeset -U PATH path
BINPATH="$HOME/bin"
path+=("$BINPATH" ${BINPATH}/*/)
export PATH

これにより、$ BINPATHのすべてのサブディレクトリが$ PATH配列に追加されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.