Wie kann ich alle Unterverzeichnisse eines Verzeichnisses in $ PATH setzen?
38
Es sieht so aus, als ob beim Hinzufügen eines Verzeichnisses zu $ PATH seine Unterverzeichnisse nicht rekursiv hinzugefügt werden. Also kann ich das machen? Oder gibt es einen Grund, warum dies nicht unterstützt wird?
@alex: Warum denkst du gibt es keine Notwendigkeit?
Tim
4
@Tim wird nicht "allgemein" unterstützt, da es ein Sicherheitsrisiko darstellt und im Allgemeinen nicht benötigt wird. Wenn Sie Ihrem Pfad rekursiv Verzeichnisse hinzufügen, die wissen, was möglicherweise darin stecken bleibt, wird die Prüfung erheblich schwieriger.
Xenoterracide
4
@Tim: Es ist eine wirklich überraschende und ungewöhnliche Sache, deshalb.
Alex
8
@alex was ist mit Unterverzeichnissen im bin-Verzeichnis? Ich würde gerne Skripte in Verzeichnissen im Ordner bin organisieren.
Andy
Antworten:
19
Fügen Sie sie rekursiv mit find hinzu:
PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )
WARNUNG: Wie in den Kommentaren zur Frage erwähnt, wird dies nicht empfohlen, da dies ein Sicherheitsrisiko darstellt, da keine Garantie dafür besteht, dass ausführbare Dateien in den hinzugefügten Verzeichnissen nicht schädlich sind.
Warnung: Diese Antwort ist technisch korrekt, aber wie Alex und Xenoterracide bemerken, ist dies eine verrückte, unsichere Sache, die Sie unbedingt zweimal überlegen sollten, bevor Sie sie tatsächlich verwenden.
Caleb
2
Bitte fügen Sie Ihrer Antwort eine Warnung hinzu, warum dies in der Praxis keine gute und sichere Sache ist.
Caleb
3
Ich würde es nicht für besonders gefährlich halten ; Das Hinzufügen zufälliger Verzeichnisse zu $PATHist gefährlich, aber das Hinzufügen von Unterverzeichnissen ist nicht wesentlich schlimmer. Aber es ist normalerweise nutzlos und möglicherweise ineffizient (und kann manchmal sogar zu Einschränkungen der Umgebungsgröße führen).
Gilles 'SO- hör auf böse zu sein'
3
@Caleb: vielleicht verrückt, aber warum unsicher? Wenn jemand Zugriff auf das Hinzufügen von schädlichen ausführbaren Dateien in Unterverzeichnissen hat, kann er diese auch zum übergeordneten Verzeichnis (dh ~/binoder ~/scripts) hinzufügen , damit die Sicherheit gleich bleibt.
MestreLion
2
Sicherheitsrisiko, wenn Sie in einer Umgebung arbeiten, in der zufällige Personen schädliche Dateien zu Ihrer Umgebung hinzufügen können ~/scripts. Ich nicht und sollte auch niemand anderes
oseiskar
21
In der üblichen Unix-Verzeichnisstruktur werden Anwendungsdateien nach Art in Verzeichnisse sortiert: binfür ausführbare Dateien, libfür Bibliotheken, docfür die Dokumentation usw. In diesem Fall werden sie in separaten Verzeichnissen installiert. oft sind Anwendungen in wenigen Verzeichnissen gruppiert (daher viele Systeme haben nur drei Verzeichnisse in $PATH: /usr/local/bin, /usr/binund /bin). Es kommt selten vor, dass sich sowohl ausführbare Dateien als auch Unterverzeichnisse in einem Verzeichnis befinden. Daher ist es nicht erforderlich, die Unterverzeichnisse eines Verzeichnisses in dieses Verzeichnis aufzunehmen $PATH.
Gelegentlich kann es nützlich sein, alle binUnterverzeichnisse von Unterverzeichnissen eines bestimmten Verzeichnisses in Folgendes aufzunehmen $PATH:
for d in /opt/*/bin; do PATH="$PATH:$d"; done
Dies wird jedoch selten durchgeführt. Die übliche Methode, wenn ausführbare Dateien in Nicht-Standard-Verzeichnissen vorhanden sein sollen, $PATHbesteht darin, symbolische Verknüpfungen in einem Verzeichnis im Pfad wie z /usr/local/bin. Das stowDienstprogramm (oder xstow) kann in dieser Hinsicht nützlich sein.
Ein Grund dafür, dass dies nicht unterstützt wird, besteht darin, dass die Verzeichnisse bin / (und ähnliche) symbolische Links verwenden, um auf die spezifischen Verzeichnisse zu verweisen, in denen die tatsächlichen ausführbaren Dateien für Programme installiert sind.
Wenn Ihr $PATHIncludes /usr/local/bin(was es höchstwahrscheinlich tut) diesen Ordner voller symbolischer Links (wie ruby) enthält, die auf das spezifische Verzeichnis verweisen, in dem sich der Code befindet, mit dem Ruby ausgeführt werden soll (wie ../Cellar/ruby/2.1.3/bin/ruby).
Aus diesem Grund müssen Sie nicht für jede ausführbare Datei den Ordner in Ihrem Ordner angeben $PATH. Die symbolischen Links, die normalerweise in den Verzeichnissen bin / type zu finden sind, erledigen dies für Sie.
Antworten:
Fügen Sie sie rekursiv mit find hinzu:
WARNUNG: Wie in den Kommentaren zur Frage erwähnt, wird dies nicht empfohlen, da dies ein Sicherheitsrisiko darstellt, da keine Garantie dafür besteht, dass ausführbare Dateien in den hinzugefügten Verzeichnissen nicht schädlich sind.
Es ist wahrscheinlich eine bessere Lösung, Gilles ' Antwort zu folgen und Stow zu verwenden
quelle
$PATH
ist gefährlich, aber das Hinzufügen von Unterverzeichnissen ist nicht wesentlich schlimmer. Aber es ist normalerweise nutzlos und möglicherweise ineffizient (und kann manchmal sogar zu Einschränkungen der Umgebungsgröße führen).~/bin
oder~/scripts
) hinzufügen , damit die Sicherheit gleich bleibt.~/scripts
. Ich nicht und sollte auch niemand anderesIn der üblichen Unix-Verzeichnisstruktur werden Anwendungsdateien nach Art in Verzeichnisse sortiert:
bin
für ausführbare Dateien,lib
für Bibliotheken,doc
für die Dokumentation usw. In diesem Fall werden sie in separaten Verzeichnissen installiert. oft sind Anwendungen in wenigen Verzeichnissen gruppiert (daher viele Systeme haben nur drei Verzeichnisse in$PATH
:/usr/local/bin
,/usr/bin
und/bin
). Es kommt selten vor, dass sich sowohl ausführbare Dateien als auch Unterverzeichnisse in einem Verzeichnis befinden. Daher ist es nicht erforderlich, die Unterverzeichnisse eines Verzeichnisses in dieses Verzeichnis aufzunehmen$PATH
.Gelegentlich kann es nützlich sein, alle
bin
Unterverzeichnisse von Unterverzeichnissen eines bestimmten Verzeichnisses in Folgendes aufzunehmen$PATH
:Dies wird jedoch selten durchgeführt. Die übliche Methode, wenn ausführbare Dateien in Nicht-Standard-Verzeichnissen vorhanden sein sollen,
$PATH
besteht darin, symbolische Verknüpfungen in einem Verzeichnis im Pfad wie z/usr/local/bin
. Dasstow
Dienstprogramm (oderxstow
) kann in dieser Hinsicht nützlich sein.quelle
Ein Grund dafür, dass dies nicht unterstützt wird, besteht darin, dass die Verzeichnisse bin / (und ähnliche) symbolische Links verwenden, um auf die spezifischen Verzeichnisse zu verweisen, in denen die tatsächlichen ausführbaren Dateien für Programme installiert sind.
Wenn Ihr
$PATH
Includes/usr/local/bin
(was es höchstwahrscheinlich tut) diesen Ordner voller symbolischer Links (wieruby
) enthält, die auf das spezifische Verzeichnis verweisen, in dem sich der Code befindet, mit dem Ruby ausgeführt werden soll (wie../Cellar/ruby/2.1.3/bin/ruby
).Aus diesem Grund müssen Sie nicht für jede ausführbare Datei den Ordner in Ihrem Ordner angeben
$PATH
. Die symbolischen Links, die normalerweise in den Verzeichnissen bin / type zu finden sind, erledigen dies für Sie.quelle