Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: [[b]a]sh, \'$@\' без кавычек -- признак ошибки   Valentin Nechayev   31 May 2003 11:08:15 
Архивное /ru.linux/7368e04ddc15.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional