Представьте, что у меня есть путь, которого не существует:
$ ls /foo/bar/baz/hello/world
ls: cannot access /foo/bar/baz/hello/world: No such file or directory
Но скажем /foo/bar
, существует. Есть ли быстрый способ для меня, чтобы определить, что baz
является переломным моментом на пути?
Я использую Bash.
access(2)
не очень детализирован, поэтому решение обычно включает в себя написание чего-то для итерации и проверки каждого элемента пути по очереди ...Ответы:
Учитывая канонический путь, такой как ваш, это будет работать:
Он печатает последний полностью существующий / доступный компонент
$pathname
и помещает каждый из них отдельно в массив arg. Первый несуществующий компонент не печатается, но сохраняется в$p
.Вы можете подойти к этому противоположно:
Это либо вернется соответственно, либо уменьшится по
$path
мере необходимости. Он отклоняет попытку изменения/
, но в случае успеха напечатает как ваш текущий рабочий каталог, так и каталог, в который он переходит на стандартный вывод. Ваш ток$PWD
будет также введен$OLDPWD
.источник
for p in $pathname
будут разделены слова на разделение и расширение пути.$IFS
. это именно то, как это работает. он не подлежит расширению пути, за исключением того, что вызываемая здесь переменная$pathname
расширяется до массива компонентов пути, разделенных на$IFS
.$pathname
с помощьюset -f
«, который не возвращается к значению по умолчанию.ns
, что, если оно будет использовано здесь, сделает это обсуждение спорным.Одна из моих любимых утилит является
namei
частьюutil-linux
и, следовательно, обычно присутствует только в Linux:Но его вывод не очень разбирается. Так что, если вы просто хотите указать, что чего-то не хватает, это
namei
может быть полезно.Это полезно для устранения общих проблем с доступом к пути, поскольку вы можете указать, является ли компонент ссылкой или точкой монтирования, а также его разрешениями:
Столица
D
указывает точку монтирования.источник
namei
работает для меня до тех пор, пока он подает путь, который существует, но когда я даю ему путь, которого нет, я не получаюnamei: failed to stat: /usr/share/foo/bar: No such file or directory
.Примерно так (с учетом путей к файлам со встроенными пробелами):
источник
cd not_a_directory
ваша оболочка просто напишите в stderr что-то вродеcd:cd:6: no such file or directory: not_a_directory
. На самом деле, оболочка пользователя будет делать это в формате, с которым пользователь, вероятно, уже очень хорошо знаком. В конце концов, это почти всегда и легче, и лучше, в конце концов, просто делать вещи и позволить оболочке обрабатывать отчеты по мере необходимости. Такая философия, тем не менее, требует очень строгого внимания к возвращаемым ценностям и их продвижению / сохранению.Просто альтернативное решение для bash, предполагая, что путь является абсолютным (начинается с /):
источник
pa
какpa_prev
первую строку цикла while (до того, как он будет увеличен). Когда проверка для «pa» не проходит,pa_prev
имеет последний существующий каталог по указанному пути.это не просто, но вы можете поместить его в скрипт, сделать его исполняемым и вставить его где-нибудь на вашем пути, если вы собираетесь использовать его часто.
Предостережение: если имя вашего каталога на любом уровне содержит
space
символ, это НЕ будет работать.источник