Linux path-Expansion

Gast #7333079
Lesenswert?

Ich habe ein Verzeichnis mit bunt gemischten Skripten, das im path steht – da will ich Ordnung rein bringen, indem ich Unterverzeichnisse nach Themen anlege. Ich möchte aber nicht alle Unterverzeichnisse in den path eintragen.

Wie kann man der bash beibringen, automatisch auch die Unterverzeichnisse nach Skripten zu durchsuchen?

Gast #7333089
Lesenswert?

Taucher schrieb:

Ich habe ein Verzeichnis mit bunt gemischten Skripten, das im path steht – da will ich Ordnung rein bringen, indem ich Unterverzeichnisse nach Themen anlege. Ich möchte aber nicht alle Unterverzeichnisse in den path eintragen. Wie kann man der bash beibringen, automatisch auch die Unterverzeichnisse nach Skripten zu durchsuchen?

Falsche Herangehensweise: Du könntest das Bilden der $Path Variable automatisieren.

Gast #7333102
Lesenswert?

Schukostecker schrieb:

Falsche Herangehensweise: Du könntest das Bilden der $Path Variable automatisieren.

Da habe ich auch dran gedacht. Nur wenn das die bash selbst kann, dann muss man es nicht programmieren. Fragt sich nur, ob sie das kann.

Wildcards im PATH würden es tun, aber die werden dort nicht expandiert.

#7333168
Lesenswert?

Taucher schrieb:

Eine Möglichkeit wäre, in der .bashrc den PATH mit Wildcards einzutragen und dann eine Funktion aufzurufen, die die Wildcards expandiert und das Ganze dann PATH zuweist.

Man kann sich auch mit Anlauf in den Fuß schießen. Die Umgebungsvariable PATH ist sicherheitsrelevant, also setz' sie bitte von Hand. Das kann für ein paar blöde Unterverzeichnisse ja wohl nicht so schwierig sein.

Gast #7333221
Lesenswert?

Ganz anderer Ansatz - in deinem bin-Verzeichniss legst du Symlinks auf die verteilten Scripte an.

Wenn du eh schon solche Massen an Scripten hast, kommt es auf ein zusätzliches Script, was die Links anlegt, auch nicht mehr an.

#7333244
Lesenswert?

Also so schwer wär das jetzt nicht,

1
PATH="$PATH$(find /mein/script/directory -type d -exec printf ':%s' {} \;)"

in die .profile, .bashrc, ... Klappt zumindest solange du keine "bösartigen" Verzeichnisnamen hast.

Alternative war das symlink-Directory. das ist auch per find & co schnell erstellt/aktualisiert.

Dritte Option wäre ein find nach allen ausführbaren Scripten unterhalb deines Script-Folders (gnu find: "-type f -executable", portabel mit "-perm +111"), und Anlegen von bash-aliases für diese.

Vermeidet teils Nachteile von Version 1 (ellenlange $PATH-Variable) und von 2 (zusätzliches Verzeichnis, Scripte müssen aus beiden Ordnern laufen können) Behält aber den Nachteil von Version 2 bei, dass neue Scripte erst in einer frischen bash sichtbar sind.

Gast #7333252
Lesenswert?

Meine Lösung:

1
PATH=$(gawk -v PATH=$PATH -f <(cat - <<-'_EOF_'
2
  BEGIN {
3
    tempfile = "/tmp/expand-path.tmp"
4
    path=""
5
    split(PATH, p, ":")
6
    for (i in p) {
7
      if (p[i] ~ /.*\*/) {
8
        system("file " p[i] " >" tempfile)
9
        while (getline f < tempfile) {
10
          if (f ~ /directory$/) {
11
            split(f, dir, ":")
12
            path = path dir[1] ":"
13
          }
14
        }
15
      } else {
16
        path = path p[i] ":"
17
      }
18
    }
19
    print path
20
  }
21
_EOF_
22
))

Das am Ende der .bashrc expandiert Wildcards am Ende eines Pfades in PATH

#7333263
Lesenswert?

Εrnst B. schrieb:

Dritte Option wäre ein find nach allen ausführbaren Scripten unterhalb deines Script-Folders (gnu find: "-type f -executable", portabel mit "-perm +111"), und Anlegen von bash-aliases für diese.

Behält aber den Nachteil von Version 2 bei, dass neue Scripte erst in einer frischen bash sichtbar sind.

Das sollte sich mit inotifywait(1) reparieren lassen. Wahrscheinlich braucht man find(1) dann nur noch einmal zu Anfang.

#7333265
Lesenswert?

Taucher schrieb:

– ich weiß schon was ich mache…

Ja, das habe ich schon oft gehört. Aber wenn Du es wüßtest, dann wärst Du bereits selbst auf einen Oneliner mit find(1) gekommen, und müßtest also nicht hier fragen. Und wenn Du es wirklich wüßtest, dann wäre Dir selbst klar, daß Dein Vorhaben gravierende Sicherheitsprobleme provoziert.

#7333290
Lesenswert?

Also bei mir nicht:

1
dpa@dragonfly:~/bin$ mkdir x
2
dpa@dragonfly:~/bin$ mkdir x/y
3
dpa@dragonfly:~/bin$ touch x/w
4
dpa@dragonfly:~/bin$ touch x/y/w
5
dpa@dragonfly:~/bin$ echo "$PATH$( shopt -s globstar; printf ':%s' "$PWD"/**/; )"
6
/home/dpa/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/dpa/bin/:/home/dpa/bin/x/:/home/dpa/bin/x/y/
7
dpa@dragonfly:~/bin$
Gast #7333673
Lesenswert?

Taucher schrieb:

Wie kann man der bash beibringen, automatisch auch die Unterverzeichnisse nach Skripten zu durchsuchen?

das würde ich nicht machen - was spricht dagegen eine env zu haben für deinen script-root und dann per dieser direkt die script mit ordner aufzurufen

organisation ist irgendwie komisch wenn dann nachher alle namen eindeutig sein müssen - wenn du dann mal 50 scripte hast verlierst du jeden Überblick

was bringt dir das - vereinfachung Arbeitsfluss oder ruft du die Scripe sogar in anderen Scripten auf was deren Herkunft über den Path noch weiter verschleiert -> Wartungshölle

#7334965
Lesenswert?

Taucher schrieb:

ein_blöder_typ…

Stimmt, total. Vor lauter Blödheit bin ich auf sowas wie

1
PFAD=''
2
for path in $(find ~/<meineSkripte>/ -mindepth 1 -maxdepth 2 -type d); do
3
    PFAD="${PFAD}:${path}";
4
done

gekommen. Das läßt sich mit find(1) und (ggf. [e]grep(1)) feingranuliert steuern, ist aus Sicherheitssicht aber trotzdem mit Vorsicht zu genießen. Natürlich kann das auch direkt auf $PATH wirken. Ansonsten funktioniert ähnliches natürlich auch gut mit Aliassen und basename(1), dann muß man seine PATH-Variable nicht semikontrolliert erweitern.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren