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
Самое ужасное, что это скорее всего не бага, а фича. Нужно будет спросить у знакомого гуру в программировании, “что здесь собственно происходит?”
viliar said,
June 24, 2008 at 7:32 pm
Умный человек посоветовал мне простое решение. Использовать кавычки в правильном месте в правильное время:
if [ -f “$fdxxdxafdsfdl” ]
Так как в противном случае получается, что команда test ( ака [ ) вызывается просто без аргумента. Но причина, по которой в этом случае возвращается true мне все-таки не понятна.
[root@rbl reporbl]# test -f
[root@rbl reporbl]# echo $?
0
viliar said,
July 22, 2008 at 9:39 am
P.S. Забыл написать. Нет ничего лучше для дебага скриптов, чем set -x