October 12th, 2009

nepal

про баш и про даш

В баше можно сделать
. /some/file || exit 1

При этом мы получим, что хотим -- или заинлайним файл /some/file, или выйдем с ошибкой:
a.sh: line 1: /some/file: No such file or directory

Просто и понятно.

А в даше (который в Debian часто стоит шелом по умолчанию) такой фокус не проходит. Самый простой вариант добиться того, что мы делаем выше -- написать
cat /some/file >/dev/null || exit 1
. /some/file || exit 1


(Второй exit 1 тут нужен для совместимости с предыдущим вариантом, если последняя команда в /some/file вернула ненулевой код). Чем плох такой вариант (кроме того, что много писанины и имя файла два раза упоминается)? А тем, что сообщение об ошибке будет менее осмысленное:
cat: /some/file: No such file or directory

Казалось бы, причём тут cat?

Вариантом, работающим в обеих шеллах, будет что-то вроде
if test -f /some/file; then
echo "/some/file: No such file or directory"
exit 1
fi
. /some/file


Вроде всё хорошо (кроме того, что кода ещё больше, имя файла упоминается уже три раза)? Ан нет! Мы проверили, что файл есть, но не проверили, можно ли его прочитать. Ну, добавим ещё один if... Но даже и это не спасёт нас, потому что системное сообщение об ошибке strerror(ENOENT) мы заменили на своё произвольное, что сводит на нет усилия локализаторов.

Итого -- лучше всего сделать через cat, а юзер пускай догадывается, причём тут cat.

Если у кого есть более кошерный вариант -- расскажите.