06.23.08

then the bash is wrong

Posted in linux at 9:14 pm by viliar

В процессе неспешного скриптования наткнулся на неприятную особенность баша. И в очередной раз, чертыхаясь, пожалел о том, что не стал писать программу на 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

Самое ужасное, что это скорее всего не бага, а фича. Нужно будет спросить у знакомого гуру в программировании, “что здесь собственно происходит?”

2 Comments

  1. viliar said,

    June 24, 2008 at 7:32 pm

    Умный человек посоветовал мне простое решение. Использовать кавычки в правильном месте в правильное время:

    if [ -f “$fdxxdxafdsfdl” ]
    Так как в противном случае получается, что команда test ( ака [ ) вызывается просто без аргумента. Но причина, по которой в этом случае возвращается true мне все-таки не понятна.

    [root@rbl reporbl]# test -f
    [root@rbl reporbl]# echo $?
    0

  2. viliar said,

    July 22, 2008 at 9:39 am

    P.S. Забыл написать. Нет ничего лучше для дебага скриптов, чем set -x

14 queries. 0.263 seconds