06.23.08
then the bash is wrong
В процессе неспешного скриптования наткнулся на неприятную особенность баша. И в очередной раз, чертыхаясь, пожалел о том, что не стал писать программу на perl. Не то, чтобы я знаю его очень хорошо, но по-крайней мере таких ляпов там бы не было.
Дано:
# include current rbl config
if [ -f ${rblconf} ]; then
. ${rblconf}
else
echo “fail to read ${rblconf} file!”
exit 1
fi
Результат:
$ ./reposync chkr lupdate
./reposync: line 42: .: filename argument required
.: usage: . filename [arguments]
…
Сначала не мог понять, где же мой косяк. Выяснилось, что в процессе редактирования я случайно удалил строчку с определением переменной $rblconf. Почему-то bash считает нужным при файловых проверках на несуществующих переменных возвращать истину, а не ложь. Бред. Так что мы имеем вот такое:
$ if [ -f $fdxxdxafdsfdl ]; then echo “stupid, but ok”; else echo “variable unset or file does no exist”;fi
stupid, but ok
Самое ужасное, что это скорее всего не бага, а фича. Нужно будет спросить у знакомого гуру в программировании, “что здесь собственно происходит?”