Пейджер по умолчанию для чтения страницы справочника less
. Существует документация относительно less
здесь.
В особенности:
Если Вы захотите надежно протестировать, является ли каталог подкаталогом другого, Вам будут нужны больше, чем просто строковая проверка префикса. Ответ жабр описывает подробно, как сделать этот тест правильно.
Но если Вы действительно хотите проверку префикса простой строки (возможно, Вы уже нормализовали свои пути?), это - хорошее:
test "${PWD##/home/}" != "${PWD}"
Если $PWD
запускается с "/домой / ", это является неизолированным в левой стороне, что означает, что это не будет соответствовать правой стороне, таким образом"! =", возвращает true.
Чтобы протестировать, если строка является префиксом другого в какой-либо оболочке стиля Границы:
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; })"/*) …
Сырая версия:
[ ${PWD:0:6} = "/home/" ]
Имеет недостаток, что нужно считать символы сначала, и нельзя заменить /home/
чем-то общим как $1
.
редактирование (благодарит @Michael), чтобы обобщение соответствовало $VAR
можно использовать
[ "${PWD:0:${#VAR}}" = $VAR ]
${#var}
длина $var
, таким образом, можно обобщить его как [ "${PWD:0:${#1}}" = "$1" ]
– Michael Mrozek♦
25.01.2011, 17:58
Я не понимаю вопроса слишком хорошо, но найти родителя $PWD, сделать dirname $PWD
. Для нахождения родителя родителя работать dirname $(dirname $PWD)
, и так далее...
/
. Хорошо, я мог проверить рекурсивно, но не являюсь там чем-то более легким?
– Tobias Kienzler
25.01.2011, 17:41
Используя awk
:
echo $PWD | awk -v h="/home" '$0 ~ h {print "MATCH"}'
Гм, это - жалость это [
не имеет опции тестирования STRING1 starts with STRING2
состояние.
Можно попробовать echo $PWD | grep '^$VAR'
, но это может перестать работать интересными способами когда VAR
содержит специальные символы.
awk
index
функция должна смочь добиться цели. Но все это кажется просто слишком тяжелым для такой легкой вещи протестировать.
Если искавшая часть пути найдена, я "освобождаю" переменную:
[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
[ "${PWD##$VAR}" != "$PWD" ]
И если бы это было [гольф кода] (stackoverflow.com/questions/tagged/code-golf) вопрос, Вы победили бы меня двумя символами ;-) Также это выглядит более читаемым... – Tobias Kienzler 26.01.2011, 13:16${PWD/#$HOME/\~}
– user1338062 01.11.2015, 10:24"${PWD%%/subdir*}"
обнаружить, является ли пользователь в настоящее время вsubdir
или в подкаталогеsubdir
, с тех пор %% получает от конца строки вместо начала. Это должно быть полезно для любого ищущего больше информации о замене параметра: tldp.org/LDP/abs/html/parameter-substitution.html – George Pantazes 23.01.2018, 21:21