Es ist möglich, alle Unterverzeichnisse hinzuzufügen, wenn ein Verzeichnis zu $ ​​PATH hinzugefügt wird

8

Beim Hinzufügen eines Verzeichnisses zu $ ​​PATH durch PATH = ~ / my_program / bin: ”$ {PATH}”

  1. Stimmt es, dass nur ausführbare Dateien direkt unter dem Verzeichnis über $ PATH gefunden werden, andere ausführbare Dateien unter den Unterverzeichnissen jedoch nicht?
  2. Ist es möglich, alle Unterverzeichnisse hinzuzufügen? Manchmal kann die explizite Angabe aller Unterverzeichnisse viel Arbeit bedeuten, wenn es viele gibt.

Danke und Grüße!

Tim
quelle

Antworten:

5

Dieses Skript verwendet tree...

  • sudo apt-get install tree

Sie können die Tiefe von Verzeichnissen durch Ändern ändern -L 1
und auswählen, ob ~/...

UPDATE 2 :
.. hat das Skript so geändert, dass nur ein führender / home / user / (nicht "any") ersetzt wird
.. und Argumente hinzugefügt ..

UPDATE Check hinzugefügt: .. Füge kein Verzeichnis zu PATH hinzu, wenn es bereits in PATH ist. Bei dieser Prüfung werden '~ /' und '/ home / user /' als unterschiedlich angesehen.

Zu Ihrer Frage 1 ... ja, es ist wahr; Jedes spezifische Verzeichnis muss im PATH einzeln spezifiziert werden.

Zu Ihrer Frage 2 ... Hier ist ein Skript, das macht, was Sie wollen.
Ich habe es getestet, aber so wie es aussieht, wird es den neuen PFAD für die aktuelle Sitzung erstellen.
Um es dauerhaft zu machen, können Sie es verwenden export PATH(aber Ich bin ein bisschen skizzenhaft in den Details von export)

#
# name: path-add-dirs
# eg: $ path-add-dirs "$HOME/bin" "tilde" 1

# When directories are $HOME based, choose format.
# Add directories in tidle format: ~/...
#       ...or as fullly-qualified: /home/user/...

# mode values: "tilde", or  anything else for fully-qualified   
mode="$2" # valid mode values: "tilde", or  anything else   
maindir="$1"; dirs= ; echo
# Buld string of subdirectories to a depth/level of 1  
while IFS= read -r dir ; do
  # Don't add directory if it is already in PATH
  if [[ "$mode" == "tilde" ]] ; then
    # replace only a *leading* :/home/user/ 
    homecheck=":$dir"                    
    dircheck="${homecheck/:$HOME\//:~/}"
    dircheck="${dircheck#:}"
  else
    dircheck="${dir}"
  fi;
  pathcheck=":$PATH:"
  if [[ "$pathcheck" != "${pathcheck/:$dircheck:/}" ]] ; then  
    echo "ALREADY IN PATH: $dircheck"
  else
    dirs="$dirs:$dir"  
    echo " added: $dircheck"
  fi
done < <(tree --noreport -L $3 -fi -d "$maindir")
# Choose one of these two options
if [[ "$mode" == "tilde" ]] 
then PATH="$PATH${dirs//:$HOME\//:~/}" # change :$HOME to :~/ 
else PATH="$PATH$dirs" # this method has fully expanded $HOME
fi
echo
echo "$PATH"
echo
Peter.O
quelle
3

Dies ist nicht möglich, da UNIX-basierte Systeme nicht dafür ausgelegt sind. Normalerweise befinden sich alle ausführbaren Dateien in einem kleinen Verzeichnis. Zum Beispiel geht alles, was ich für meine eigenen Zwecke schreibe, in ~ / bin.

Wenn Sie nicht möchten, dass Ihre tatsächlichen Binärdateien und Skripte in einem bin-Verzeichnis gespeichert werden, können Sie einen Symlink in z. B. ~ / bin zur tatsächlichen Binärdatei erstellen.

Es ist nicht besonders wünschenswert, alle Unterverzeichnisse in $ PATH zu haben, da nur mehr Verzeichnisse zur Suche hinzugefügt werden, das Risiko erhöht wird, dass andere ausführbare Dateien in Ihren PATH gelangen, die nicht vorhanden sein sollten, und nicht wirklich von großem Nutzen sind.

Scott Severance
quelle
2

Dies sollte den Job machen

PATH="$PATH:$(find ~/bin -type d -printf ":%p")"

Bitte berücksichtigen Sie dies

  • Der gesamte Verzeichnisbaum wird durchlaufen, was einige Zeit dauern kann. Versuchen Sie daher, die Hierarchie klein zu halten.
  • Dies berücksichtigt keine Verzeichnisse, die nach dem Festlegen des PATH erstellt wurden.
  • Wenn Sie dies mehrmals aufrufen, werden im PATH viele Duplikate angezeigt. Möglicherweise möchten Sie den ursprünglichen Pfad einer temporären Variablen zuweisen (z. B. OLD_PATH).
Adam Byrtek
quelle
Zwei Fehler: Es werden keine absoluten Pfade hinzugefügt -> es funktioniert nicht richtig. Außerdem werden zwei Doppelpunkte hinzugefügt. Entfernen: nach $ PATH.
Olli
1

Nein, das ist nicht einfach möglich. Wäre es möglich, allen ausführbaren Dateien Softlinks zu "~ / my_program / bin" hinzuzufügen?

ddeimeke
quelle