Imaginez que j'ai un chemin qui n'existe pas:
$ ls /foo/bar/baz/hello/world
ls: cannot access /foo/bar/baz/hello/world: No such file or directory
Mais disons /foo/bar
qu'il existe. Existe-t-il un moyen rapide pour moi de déterminer que baz
c'est le point de rupture du chemin?
J'utilise Bash.
access(2)
n'est pas très granulaire, donc la solution consiste généralement à écrire quelque chose pour itérer et tester chaque élément de chemin à son tour ...Réponses:
Étant donné un chemin d'accès canonique, tel que le vôtre, cela fonctionnera:
Cela imprime à travers le dernier composant entièrement existant / accessible de
$pathname
, et place chacun de ceux-ci séparément dans le tableau arg. Le premier composant inexistant n'est pas imprimé, mais il est enregistré dans$p
.Vous pourriez l'approcher à l'opposé:
Cela reviendra de façon appropriée ou se réduira
$path
au besoin. Il refuse de tenter une modification vers/
, mais en cas de succès, il imprime à la fois votre répertoire de travail actuel et le répertoire dans lequel il se transforme en stdout. Votre courant$PWD
sera également enregistré$OLDPWD
.la source
for p in $pathname
sera soumis à la "division des mots" et à "l'expansion du nom de chemin"$IFS
. c'est exactement comme ça que ça marche. il n'est pas soumis à l'expansion du nom de chemin, sauf que la variable appelée ici$pathname
est étendue à un tableau de composants de chemin comme partagé$IFS
.$pathname
en utilisantset -f
"qui n'est pas retourné à sa valeur par défaut.ns
ce qui, s'il était utilisé ici, rendrait cette discussion théorique.L'une de mes utilités préférées est
namei
, faisant partie deutil-linux
et donc généralement présente uniquement sur Linux:Mais sa sortie n'est pas très analysable. Donc, si vous souhaitez simplement signaler qu'il manque quelque chose, cela
namei
pourrait être utile.Il est utile pour résoudre les problèmes généraux d'accès à un chemin, car vous pouvez lui faire indiquer si un composant est un lien ou un point de montage, ainsi que ses autorisations:
La capitale
D
indique un point de montage.la source
namei
fonctionne pour moi tant qu'un flux lui donne un chemin qui existe, mais quand je lui en donne un que je ne reçois pasnamei: failed to stat: /usr/share/foo/bar: No such file or directory
.Quelque chose comme ça (en tenant compte des chemins d'accès avec des blancs intégrés):
la source
cd not_a_directory
écrire à votre shell quelque chose comme stderrcd:cd:6: no such file or directory: not_a_directory
. En fait, le shell de l'utilisateur le fera dans un format avec lequel l'utilisateur est probablement déjà très familier. Il est presque toujours à la fois plus facile et meilleur à la fin de faire des choses et de laisser le shell gérer les rapports si nécessaire. Ce type de philosophie nécessite cependant une attention très stricte aux valeurs de retour et à leur promotion / préservation.Juste une solution alternative pour bash, en supposant que le chemin est un chemin absolu (commence par /):
la source
pa
tantpa_prev
que première ligne de la boucle while (avant qu'elle ne soit incrémentée). Lorsque le test de "pa" échoue,pa_prev
le dernier répertoire existant se trouve dans le chemin d'accès indiqué.ce n'est pas simple mais vous pouvez le mettre dans un script, le rendre exécutable et le coller quelque part sur votre chemin, si vous allez l'utiliser fréquemment.
Caveat emptor: Si votre nom de répertoire à n'importe quel niveau contient un
space
caractère, cela ne fonctionnera PAS.la source