Stellen Sie sich vor, ich habe einen Pfad, den es nicht gibt:
$ ls /foo/bar/baz/hello/world
ls: cannot access /foo/bar/baz/hello/world: No such file or directory
Aber sagen wir, /foo/bar
es gibt sie. Gibt es für mich eine schnelle Möglichkeit, festzustellen, ob dies baz
der Bruchpunkt im Pfad ist?
Ich benutze Bash.
access(2)
ist nicht sehr detailliert, daher besteht die Lösung in der Regel darin, etwas zu schreiben, um jedesAntworten:
Bei einem kanonischen Pfadnamen wie dem Ihren funktioniert Folgendes:
Das druckt durch die letzte vollständig vorhandene / zugängliche Komponente von
$pathname
und fügt jede dieser Komponenten separat in das arg-Array ein. Die erste nicht vorhandene Komponente wird nicht gedruckt, aber in gespeichert$p
.Sie könnten es umgekehrt angehen:
Das wird entweder angemessen zurückgegeben oder nach
$path
Bedarf reduziert . Es wird abgelehnt, eine Änderung zu versuchen./
Wenn dies jedoch erfolgreich ist, werden sowohl das aktuelle Arbeitsverzeichnis als auch das Verzeichnis gedruckt, in das stdout geändert wird. Ihr Strom$PWD
wird ebenfalls eingespeist$OLDPWD
.quelle
for p in $pathname
unterliegt "Wortteilung" und "Pfadnamenerweiterung".$IFS
. Genau so funktioniert es. Es unterliegt keiner Pfadnamenerweiterung, mit der Ausnahme, dass die hier aufgerufene Variable$pathname
zu einem Array von Pfadkomponenten erweitert wird, die aufgeteilt werden$IFS
.$pathname
mitset -f
", die nicht auf den Standardwert zurückgesetzt wird.ns
.Eine meiner Lieblingsanwendungen ist ein
namei
Teil vonutil-linux
und daher generell nur unter Linux:Die Ausgabe ist jedoch nicht sehr syntaktisch. Wenn Sie also nur darauf hinweisen möchten, dass etwas fehlt, ist dies
namei
möglicherweise hilfreich.Dies ist nützlich, um allgemeine Probleme beim Zugriff auf einen Pfad zu beheben, da Sie feststellen können, ob es sich bei einer Komponente um einen Link oder einen Mount-Punkt handelt, und um die Berechtigungen:
Die Hauptstadt
D
gibt einen Einhängepunkt an.quelle
namei
funktioniert für mich so lange es einen Pfad gibt, aber wenn ich ihm einen gebe, den ich nicht bekommenamei: failed to stat: /usr/share/foo/bar: No such file or directory
.So ähnlich (Pfadnamen mit eingebetteten Leerzeichen berücksichtigen):
quelle
cd not_a_directory
deine Shell schreibst, schreibst du einfach so etwas wie stderrcd:cd:6: no such file or directory: not_a_directory
. Tatsächlich wird die Shell des Benutzers dies in einem Format tun, mit dem der Benutzer wahrscheinlich bereits sehr vertraut ist. Es ist ohnehin fast immer einfacher und besser, nur Dinge zu erledigen und die Shell die Berichterstellung nach Bedarf erledigen zu lassen. Diese Art von Philosophie erfordert jedoch eine sehr strenge Beachtung der Rückgabewerte und der Förderung / Bewahrung derselben.Nur eine alternative Lösung für bash, vorausgesetzt, der Pfad ist ein absoluter Pfad (beginnt mit /):
quelle
pa
alspa_prev
erste Zeile der while-Schleife gespeichert (bevor er inkrementiert wird). Wenn der Test für "pa" dann fehlschlägt,pa_prev
hat das zuletzt vorhandene Verzeichnis den angegebenen Pfad.Es ist nicht einfach, aber Sie können es in ein Skript einfügen, es ausführbar machen und es irgendwo in Ihrem Pfad ablegen, wenn Sie es häufig verwenden.
Vorsichtsmaßnahme: Wenn Ihr Verzeichnisname auf einer beliebigen Ebene ein
space
Zeichen enthält , funktioniert dies NICHT.quelle