Как проверить, является ли $PWD подкаталогом данного пути

Пейджер по умолчанию для чтения страницы справочника less. Существует документация относительно less здесь.

В особенности:

  • Прокрутка/вниз на одну страницу: b / пространство
  • Прокрутите/вниз наполовину страницу: u / d
  • Поиск вперед/назад://?, затем введите регулярное выражение,
    • затем затем хит n для движения в следующее соответствие или
    • сместитесь + N для движения в предыдущее соответствие.
    • Если страница покрыта неинтересными соответствиями, поразите пространство для движения в следующую страницу.
  • Добавьте перед регулярным выражением для поиска от запуска.

26
25.01.2011, 22:41
7 ответов

Если Вы захотите надежно протестировать, является ли каталог подкаталогом другого, Вам будут нужны больше, чем просто строковая проверка префикса. Ответ жабр описывает подробно, как сделать этот тест правильно.

Но если Вы действительно хотите проверку префикса простой строки (возможно, Вы уже нормализовали свои пути?), это - хорошее:

test "${PWD##/home/}" != "${PWD}"

Если $PWD запускается с "/домой / ", это является неизолированным в левой стороне, что означает, что это не будет соответствовать правой стороне, таким образом"! =", возвращает true.

27
27.01.2020, 19:39
  • 1
    +1 удара, и для более общего случая: [ "${PWD##$VAR}" != "$PWD" ] И если бы это было [гольф кода] (stackoverflow.com/questions/tagged/code-golf) вопрос, Вы победили бы меня двумя символами ;-) Также это выглядит более читаемым... –  Tobias Kienzler 26.01.2011, 13:16
  • 2
    FWIW, это может быть также полезно: ${PWD/#$HOME/\~} –  user1338062 01.11.2015, 10:24
  • 3
    Хорошо, но как насчет PWD = "/home/../и т.д. /" –  Alexis Peters 22.03.2016, 16:21
  • 4
    @AlexisPeters: Вы правы: Я фокусировался на "строковой части" префикса вопроса, и я отредактировал для создания этого более ясным. Gilles приятно покрыл надлежащий способ проверить на подкаталоги. –  Jander 22.03.2016, 22:34
  • 5
    Использовать "${PWD%%/subdir*}" обнаружить, является ли пользователь в настоящее время в subdir или в подкаталоге subdir, с тех пор %% получает от конца строки вместо начала. Это должно быть полезно для любого ищущего больше информации о замене параметра: tldp.org/LDP/abs/html/parameter-substitution.html –  George Pantazes 23.01.2018, 21:21

Чтобы протестировать, если строка является префиксом другого в какой-либо оболочке стиля Границы:

case $PWD/ in
  /home/*) echo "home sweet home";;
  *) echo "away from home";;
esac

Тот же принцип работает на тест подстроки или суффикс. Отметьте это в case конструкции, в отличие от этого, в именах файлов, * соответствия любой символ, включая a / или начальная буква ..

В оболочках, которые реализуют [[ … ]] синтаксис (т.е. удар, ksh и zsh), это может использоваться для соответствия строке против шаблона. (Обратите внимание что [ команда может только протестировать строки на равенство.)

if [[ $PWD/ = /home/* ]]; then …

Если Вы конкретно тестируете, является ли текущий каталог внизу /home, простой тест подстроки недостаточно из-за символьных ссылок.

Если /home собственная файловая система, протестируйте ли текущий каталог (.) находится в той файловой системе.

if [ "$(df -P . | awk 'NR==2 {print $6}')" = "/home" ]; then
  echo 'The current directory is on the /home filesystem'
fi

Если у Вас есть NetBSD, OpenBSD или GNU (т.е. Linux) readlink, можно использовать readlink -f разделять символьные ссылки от пути.

case $(readlink -f .)/ in $(readlink -f /home)/*) …

Иначе можно использовать pwd показать текущий каталог. Но необходимо заботиться для не использования оболочки, встроенной, если оболочка отслеживает cd команды и сохраняют имя, Вы раньше достигали каталога, а не его “фактического” местоположения.

case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
  "$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) …
33
27.01.2020, 19:39
  • 1
    +1 работ спасибо за этот исчерпывающий ответ. Я не рассматривал ссылки и особенности файловой системы при выяснении у этого, но определенно хорошо знать –  Tobias Kienzler 26.01.2011, 13:08

Сырая версия:

[ ${PWD:0:6} = "/home/" ]

Имеет недостаток, что нужно считать символы сначала, и нельзя заменить /home/ чем-то общим как $1.

редактирование (благодарит @Michael), чтобы обобщение соответствовало $VAR можно использовать

[ "${PWD:0:${#VAR}}" = $VAR ]
8
27.01.2020, 19:39
  • 1
    ${#var} длина $var, таким образом, можно обобщить его как [ "${PWD:0:${#1}}" = "$1" ] –  Michael Mrozek♦ 25.01.2011, 17:58
  • 2
    @Michael Mrozek  CentOS: Спасибо, идеальный :) –  Tobias Kienzler 26.01.2011, 13:03

Я не понимаю вопроса слишком хорошо, но найти родителя $PWD, сделать dirname $PWD. Для нахождения родителя родителя работать dirname $(dirname $PWD), и так далее...

2
27.01.2020, 19:39
  • 1
    Это только работало бы, если бы я знал глубину, иначе я заканчиваю с /. Хорошо, я мог проверить рекурсивно, но не являюсь там чем-то более легким? –  Tobias Kienzler 25.01.2011, 17:41
  • 2
    @tob, Если только я знал ;-) –  tshepang 25.01.2011, 18:06

Используя awk:

echo $PWD | awk -v h="/home" '$0 ~ h {print "MATCH"}'
1
27.01.2020, 19:39
  • 1
    +1 для работы, но немного медленнее, чем собственный тестовый прекрасный –  Tobias Kienzler 26.01.2011, 13:13

Гм, это - жалость это [ не имеет опции тестирования STRING1 starts with STRING2 состояние.

Можно попробовать echo $PWD | grep '^$VAR', но это может перестать работать интересными способами когда VAR содержит специальные символы.

awk index функция должна смочь добиться цели. Но все это кажется просто слишком тяжелым для такой легкой вещи протестировать.

0
27.01.2020, 19:39
  • 1
    [[делает regexp, так эй получают startswith [[$PWD = ~ ^\\/home\/]] –  teknopaul 03.12.2015, 01:32

Если искавшая часть пути найдена, я "освобождаю" переменную:

[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
0
27.01.2020, 19:39

Теги

Похожие вопросы