|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Valentin Nechayev 2:5020/400 31 May 2003 11:08:15 To : Kirill Frolov Subject : Re: [[b]a]sh, '$@' без кавычек -- признак ошибки -------------------------------------------------------------------------------- >>> Kirill Frolov wrote: KF> Hасколько я прав в том, что использование переменной '$@' в качестве KF> аргумента вызываемой программы _без_ _двойных_ _кавычек_ -- признак KF> серьёзной ошибки? Разбиваются же аргументы по словам. А вот _как_ они разбиваются? Смотри: netch@iv:/tmp>cat 3.sh #!/bin/sh for D in $@; do echo "$D"; done netch@iv:/tmp>sh 3.sh "a b" "c" a b c А чтобы передать точно, надо было сделать иначе: netch@iv:/tmp>cat 4.sh #!/bin/sh for D in "$@"; do echo "$D"; done netch@iv:/tmp>sh 4.sh "a b" "c" a b c Вот теперь - аргументы переданы точно, без изменения. KF> Меня сильно смущает то, что в /usr/bin каждый n-ый скрипт допускает KF> разбиение аргументов командной строки по словам. В результате имена файлов KF> или опции с пробелами они не понимают, да и много бед натворить могут из-за KF> случайной ошибки. :-( :-/ Пиши problem reports. KF> А ещё меня сильно смущает вот такое (из /etc/init.d/proftpd): KF> if [ "x$RUN" = "xyes" ] ; then KF> if [ "x$INETD" = "xyes" ] ; then KF> if [ "x$RUN" = "xyes" ] ; then KF> if [ "x$INETD" = "xyes" ] ; then KF> Буква "x" зачем здесь? Почему нельзя написать "$RUN" = "yes" ? KF> То есть написать-то можно и будет работать даже, но в чём же здесь подвох? В том, что test (он же [) некоторые опции понимает как бинарные, а некоторые - как унарные. И если ты напишешь if [ "$RUN" = yes ]; then ... ; fi а $RUN будет при этом равно "-f", то вместо сравнения значений на равенство будет проверка файла "=" на существование, а затем - синтаксически неуместное слово "yes", которое вызовет ошибку синтаксического разбора. Вообще, test в этом смысле сделан уродски - надо было ему сделать синтаксис жёстко префиксный (код операции перед обоими операндами). -netch- --- ifmail v.2.15dev5 * Origin: Dark side of coredump (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/7368e04ddc15.html, оценка из 5, голосов 10
|