Вот очень прагматичная идиома:
(cd $dir) || return # is this a directory,
# and do we have access?
Я обычно заключаю его в функцию:
can_use_as_dir() {
(cd ${1:?pathname expected}) || return
}
Или:
assert_dir_access() {
(cd ${1:?pathname expected}) || exit
}
Хорошая особенность этого подхода в том, что мне не нужно думать о хорошем сообщении об ошибке.
cd
даст мне стандартное однострочное сообщение для stderr. Это также даст больше информации, чем я смогу предоставить. Выполняя cd
внутри подоболочки ( ... )
, команда не влияет на текущий каталог вызывающей стороны. Если каталог существует, эта подоболочка и функция просто не работают.
Далее следует аргумент, который мы передаем cd
: ${1:?pathname expected}
. Это более сложная форма замены параметров, которая более подробно описана ниже.
Tl; dr: Если строка, переданная в эту функцию, пуста, мы снова выходим из подоболочки ( ... )
и возвращаемся из функции с данным сообщением об ошибке.
Цитата из справочной страницы ksh93
:
${parameter:?word}
Если установлено parameter
и не равно нулю, подставьте его значение;
в противном случае выведите word
и выйдите из оболочки (если он не интерактивный).
Если word
опущено, печатается стандартное сообщение.
и
Если двоеточие :
опущено в приведенных выше выражениях, то
shell только проверяет, установлен ли параметр или нет.
Формулировка здесь характерна для документации оболочки, как может означать word
на любую разумную строку, включая пробелы.
В данном конкретном случае я знаю, что стандартного сообщения об ошибке 1: parameter not set
недостаточно, поэтому я увеличиваю тип ожидаемого здесь значения - pathname
каталога.
Философская заметка:
Оболочка не является объектно-ориентированным языком, поэтому в сообщении говорится pathname
, а не directory
. На этом уровне я бы предпочел, чтобы все было просто - аргументы функции - это просто строки.