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?
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?
Antworten:
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.
Es ist wahrscheinlich eine bessere Lösung, Gilles ' Antwort zu folgen und Stow zu verwenden
$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 anderes
In 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
:
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, $PATH
besteht darin, symbolische Verknüpfungen in einem Verzeichnis im Pfad wie z /usr/local/bin
. Das stow
Dienstprogramm (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 $PATH
Includes /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.