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


ru.linux

 
 - RU.LINUX ---------------------------------------------------------------------
 From : Valentin Nechayev                    2:5020/400     26 May 2003  21:56:20
 To : Artem Chuprina
 Subject : Re: bash
 -------------------------------------------------------------------------------- 
 
 
 >>> Artem Chuprina wrote:
 
 VW>>> ash туда ставить? Или pdksh, который в общем-то ничем не лучше bash?
 VN>> zsh.;) Hедавно по совету знакомого покопался, какой шелл понимает $IFS в
 VN>> соответствии с Posix. Правильно отработал всё только zsh, остальные слили
 VN>> (пробовались bash, pdksh, zsh и фрёвый sh).
 AC> Ой, а как они должны его понимать? У zsh, кстати, по умолчанию настройки не
 AC> вполне sh-compatible, если я правильно помню. Так, незакавыченную переменную
 AC> он передает в порождаемый процесс как один параметр независимо от пробелов в
 AC> ней. Hо настраивается.
 
 Я просто приведу здесь письмо с отчётом исследования.
 
 === BEGIN ===
 Date: Sat, 1 Feb 2003 20:22:19 +0200
 From: Valentin Nechayev <netch@segfault.kiev.ua>
 Message-ID: <20030201182219.GD1096@iv.nn.kiev.ua>
 References: <b131dn$aah$2@zeus.colocall.net>
 X-Comment-To: "Maxim A. Samoilenko" <news@delirium.kiev.ua>
 Newsgroups: fido7.ru.unix.bsd
 
 >>> Maxim A. Samoilenko wrote:
 
 MAS> Hикак не могу постичь одну вещь.
 
 MAS> smax@zeus[pf:0]~>echo $BASH_VERSION
 MAS> 2.05b.0(1)-release
 MAS> smax@zeus[pf:0]~>IFS=': '; echo 'blah : nah'| { \
 >> { read a b c ; echo "a='$a' b='$b' c='$c'"; }
 MAS> a='blah' b='' c='nah'
 MAS>          ^^^^
 MAS> Откуда там пустое значение?
 MAS> Кого из нас глючит?
 
 Я таки вкурил POSIX и попытался разобраться, что тут происходит.
 Суть правил в Posix.1-2001/SUSv3 и SUSv2, как минимум, одинакова,
 цитирую:
 
 === cut ===
    The shell shall treat each character of the IFS as a delimiter and use
    the delimiters to split the results of parameter expansion and command
    substitution into fields.
     1. If the value of IFS is a <space>, <tab>, and <newline>, or if it
        is unset, any sequence of <space>s, <tab>s, or <newline>s at the
        beginning or end of the input shall be ignored and any sequence of
        those characters within the input shall delimit a field. For
        example, the input:
 
 <newline><space><tab>foo<tab><tab>bar<space>
 
        yields two fields, foo and bar.
     2. If the value of IFS is null, no field splitting shall be
        performed.
     3. Otherwise, the following rules shall be applied in sequence. The
        term " IFS white space" is used to mean any sequence (zero or more
        instances) of white space characters that are in the IFS value
        (for example, if IFS contains <space>/ <comma>/ <tab>, any
        sequence of <space>s and <tab>s is considered IFS white space).
          a. IFS white space shall be ignored at the beginning and end of
             the input.
          b. Each occurrence in the input of an IFS character that is not
             IFS white space, along with any adjacent IFS white space,
             shall delimit a field, as described previously.
          c. Non-zero-length IFS white space shall delimit a field.
 === end cut ===
 
 Рассмотрим первый пример.
 
 IFS=': '
 echo 'blah : nah ' | { read a b c; echo "a='$a' b='$b' c='$c'"; }
 
 Порядок символов в IFS не должен иметь значения (в другом месте есть
 правило, что в $* части соединяются первым символом из IFS, но это не для
 здесь). В IFS, определены пробел (в категории IFS white space) и ':'
 (в прочих). По пункту 3b, вся конструкция ' : ' должна считаться одним
 разделителем. В конце, должен пропуститься финальный IFS white space,
 по пункту 3a. Итого должно получиться: a='blah', b='nah', c=''.
 
 Смотрим:
 
 $ sh smax1
 a='blah' b='' c=' nah '
 $ bash smax1
 a='blah' b='' c='nah'
 $ zsh smax1
 a='blah' b='nah' c=''
 $ ksh smax1
 a='blah' b='' c='nah'
 
 Такое поведение только у zsh.
 
 Теперь меняем местами символы в IFS (напоминаю, что тут их порядок
 не имеет значения).
 
 $ cat smax1.1
 IFS=' :'
 echo 'blah : nah ' | { read a b c; echo "a='$a' b='$b' c='$c'"; }
 $ sh smax1.1
 a='blah' b='nah' c=''
 $ bash smax1.1
 a='blah' b='' c='nah'
 $ zsh smax1.1
 a='blah' b='nah' c=''
 $ ksh smax1.1
 a='blah' b='' c='nah'
 
 Hа этот раз sh и zsh показали правильно.
 По двум тестам, правильное поведение только у zsh. Остальные несут чушь.
 
 Теперь меняем ':' на Tab.
 
 $ cat smax2
 IFS=`printf '\t '`
 printf 'blah \t nah\n' | { read a b c ; echo "a='$a' b='$b' c='$c'"; }
 $ sh smax2
 a='blah' b='' c=' nah'
 $ bash smax2
 a='blah' b='nah' c=''
 $ zsh smax2
 a='blah' b='nah' c=''
 $ ksh smax2
 a='blah' b='nah' c=''
 
 Тут работают правильно все кроме sh.
 Hесколько IFS white space должны разделять поля и не вставлять пустые
 поля внутри свой последовательности по правилу 3c.
 
 И только в последнем варианте все работают одинаково и правильно:
 
 $ cat smax2
 IFS=`printf ' \t'`
 printf 'blah \t nah\n' | { read a b c ; echo "a='$a' b='$b' c='$c'"; }
 $ sh smax2
 a='blah' b='nah' c=''
 $ bash smax2
 a='blah' b='nah' c=''
 $ zsh smax2
 a='blah' b='nah' c=''
 $ ksh smax2
 a='blah' b='nah' c=''
 
 Вывод - пользуйтесь zsh ;)))
 
 P.S. Всё происходящее проверено на дефолтной локали.
 Если где-то пробел или Tab - не white space, я не виноват.
 -netch-
 
 === END ===
 -netch-
 
 --- ifmail v.2.15dev5
  * Origin: Dark side of coredump (2:5020/400)
 
 

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

 Тема:    Автор:    Дата:  
 bash   Sergey Guriev   21 May 2003 20:59:46 
 Re: bash   Ruslan Kosolapov   22 May 2003 08:49:47 
 Re: bash   Yura Pismerov   22 May 2003 17:46:28 
 Re: bash   Ivan Churkin   22 May 2003 18:53:42 
 Re: bash   Evgenii Terechkov   23 May 2003 23:23:44 
 Re: bash   Victor Wagner   24 May 2003 00:55:38 
 Re: bash   Evgenii Terechkov   24 May 2003 21:47:05 
 Re: bash   Victor Wagner   24 May 2003 20:59:11 
 Re: bash   Valentin Nechayev   26 May 2003 00:50:47 
 Re: bash   Artem Chuprina   26 May 2003 14:15:40 
 Re: bash   Valentin Nechayev   26 May 2003 21:56:20 
 Re: bash   Alexey Vyskubov   27 May 2003 12:25:28 
 Re: bash   Eugene B. Berdnikov   27 May 2003 18:03:40 
 Re: bash   Valentin Nechayev   27 May 2003 20:58:36 
 zsh (was: bash)   Alexey Vyskubov   28 May 2003 10:06:52 
 Re: zsh   Alexey Vyskubov   28 May 2003 10:39:10 
 Re: zsh   Michael Shigorin   28 May 2003 23:05:43 
 Re: bash   Evgenii Terechkov   26 May 2003 23:13:20 
 Re: bash   Artem Chuprina   27 May 2003 12:05:35 
 Re: bash   Evgenii Terechkov   27 May 2003 23:49:22 
 Re: bash   Evgenii Terechkov   26 May 2003 23:12:01 
 Re: bash   Michael Shigorin   28 May 2003 23:05:42 
 Re: bash   Evgenii Terechkov   26 May 2003 05:36:14 
 Re: bash   Alexey Vyskubov   26 May 2003 11:11:31 
 Re: bash   Victor Wagner   26 May 2003 11:41:20 
 Re: bash   Alexey Vyskubov   26 May 2003 14:00:15 
 Re: bash   Valentin Nechayev   26 May 2003 00:50:47 
 Re: bash   Evgenii Terechkov   26 May 2003 23:32:49 
 Re: bash   Aleksey Cheusov   27 May 2003 17:59:00 
 Re: bash   Evgenii Terechkov   28 May 2003 00:48:53 
 Re: bash   Aleksey Cheusov   28 May 2003 12:43:05 
 Re: bash   Evgenii Terechkov   29 May 2003 00:26:00 
 Re: bash   Aleksey Cheusov   29 May 2003 11:58:47 
 Re: bash   Evgenii Terechkov   29 May 2003 22:05:36 
 Re: bash   Michael Shigorin   26 May 2003 23:05:28 
 Re: bash   Evgenii Terechkov   27 May 2003 23:39:05 
 Re: bash   Valentin Nechayev   02 Jun 2003 07:00:24 
 Re: bash   Serguei Khvatov   02 Jun 2003 13:07:53 
 Re: bash   Valentin Nechayev   02 Jun 2003 15:07:58 
 Re: bash   Serguei Khvatov   02 Jun 2003 15:58:26 
 Re: bash   Valentin Nechayev   02 Jun 2003 17:03:21 
 Re: bash   Eugene B. Berdnikov   02 Jun 2003 20:03:35 
 Re: bash   Andrew Dolgov   24 May 2003 02:25:00 
 Re: bash   Evgenii Terechkov   24 May 2003 21:58:29 
 Re: bash   Aleksey Cheusov   24 May 2003 17:58:53 
 Re: bash   Evgenii Terechkov   26 May 2003 05:58:18 
 Re: bash   Ruslan Kosolapov   26 May 2003 10:24:38 
 Re: bash   Evgenii Terechkov   26 May 2003 23:45:22 
 Re: bash   Victor Wagner   27 May 2003 00:53:35 
 Re: bash   Evgenii Terechkov   27 May 2003 23:45:33 
 Re: bash   Victor Wagner   27 May 2003 23:53:52 
 Re: bash   Evgenii Terechkov   29 May 2003 00:28:37 
 Re: bash   Eugene B. Berdnikov   29 May 2003 14:03:31 
 Re: bash   Evgenii Terechkov   29 May 2003 21:59:11 
 Re: bash   Eugene B. Berdnikov   30 May 2003 14:03:27 
 Re: bash   Evgenii Terechkov   28 May 2003 21:52:05 
 Re: bash   Michael Shigorin   30 May 2003 00:05:46 
 Re: bash   Eugene B. Berdnikov   30 May 2003 14:03:27 
 Re: bash   Vasily Tchekalkin   30 May 2003 15:08:13 
 Re: bash   Evgenii Terechkov   29 May 2003 05:37:58 
 Re: bash   Michael Shigorin   03 Jun 2003 00:05:59 
 Re: bash   Michael Shigorin   30 May 2003 00:05:45 
 bash   Evgenii Terechkov   28 May 2003 23:25:08 
 Re: bash   Aleksey Cheusov   27 May 2003 17:59:00 
 Re: bash   Evgenii Terechkov   28 May 2003 00:50:17 
 Re: bash   Alexey Vyskubov   28 May 2003 10:42:17 
 bash   Evgenii Terechkov   29 May 2003 01:07:43 
 Re: bash   Michael Shigorin   30 May 2003 00:05:46 
 Re: bash   Evgenii Terechkov   28 May 2003 21:58:40 
 Re: bash   Aleksey Cheusov   28 May 2003 12:43:05 
 bash   Evgenii Terechkov   29 May 2003 01:16:48 
 Re: bash   Aleksey Cheusov   29 May 2003 11:58:48 
 Re: bash   Evgenii Terechkov   29 May 2003 22:12:26 
 Re: bash   Alexey Vyskubov   30 May 2003 11:16:15 
 Re: bash   Eugene B. Berdnikov   30 May 2003 14:03:28 
 Re: bash   Alexey Vyskubov   30 May 2003 14:57:01 
 Re: bash   Pavel L.L.   30 May 2003 15:06:10 
 Re: bash   Alexey Vyskubov   02 Jun 2003 11:57:36 
 Re: bash   Valentin Nechayev   02 Jun 2003 12:08:23 
 Re: bash   Alexey Vyskubov   02 Jun 2003 12:49:17 
 Re: bash   Serguei Khvatov   02 Jun 2003 13:33:43 
 Re: bash   Valentin Nechayev   01 Jun 2003 21:53:38 
 Re: bash   Alexey Vyskubov   02 Jun 2003 11:59:39 
 bash   Evgenii Terechkov   02 Jun 2003 22:02:52 
 bash   Mikkle V. Sokolov   26 May 2003 10:49:32 
 Re: bash   Michael Shigorin   26 May 2003 23:05:59 
 bash   Mikkle V. Sokolov   26 May 2003 23:46:28 
 Re: bash   Evgenii Terechkov   27 May 2003 23:56:10 
 Re: bash   Michael Shigorin   28 May 2003 23:05:44 
 Re: bash   Evgenii Terechkov   26 May 2003 23:48:07 
 bash   Mikkle V. Sokolov   26 May 2003 23:48:20 
 Re: bash   Evgenii Terechkov   27 May 2003 23:40:57 
 Re: bash   Aleksey Cheusov   26 May 2003 10:59:09 
 Re: bash   Evgenii Terechkov   26 May 2003 23:33:55 
 Re: bash   Aleksey Cheusov   27 May 2003 12:59:21 
 Re: bash   Evgenii Terechkov   28 May 2003 00:04:58 
 Re: bash   Aleksey Cheusov   28 May 2003 12:42:34 
 Re: bash   Evgenii Terechkov   29 May 2003 00:33:22 
 Re: bash   Ruslan Kosolapov   29 May 2003 06:42:48 
 Re: bash   Evgenii Terechkov   29 May 2003 21:33:57 
 Re: bash   Ruslan Kosolapov   30 May 2003 07:22:39 
 Re: bash   Evgenii Terechkov   29 May 2003 05:44:39 
 Re: bash   Aleksey Cheusov   29 May 2003 11:59:19 
 Re: bash   Evgenii Terechkov   29 May 2003 21:41:58 
 Re: bash   Vladimir Bormotov   30 May 2003 01:34:40 
 Re: bash   Evgenii Terechkov   29 May 2003 05:16:27 
 Re: bash   Vladimir Bormotov   01 Jun 2003 00:30:54 
 Re: bash   Ramazan Jah-Far   01 Jun 2003 03:07:38 
 Re: bash   Evgenii Terechkov   31 May 2003 00:03:18 
 Re: bash   Aleksey Cheusov   02 Jun 2003 14:58:47 
 Re: bash   Alexey Vyskubov   02 Jun 2003 16:00:41 
 Re: bash   Artem Chuprina   02 Jun 2003 16:06:49 
 Re: bash   Aleksey Cheusov   02 Jun 2003 17:58:19 
 Re: bash   Artem Chuprina   02 Jun 2003 20:18:51 
 Re: bash   Aleksey Cheusov   02 Jun 2003 20:58:26 
 Re: bash   Valentin Nechayev   02 Jun 2003 22:18:55 
 Re: bash   Aleksey Cheusov   02 Jun 2003 23:59:52 
 Re: bash   Artem Chuprina   03 Jun 2003 13:13:55 
 Re: bash   Aleksey Cheusov   02 Jun 2003 17:58:50 
 Re: bash   Alexey Vyskubov   02 Jun 2003 18:03:54 
 Re: bash   Aleksey Cheusov   02 Jun 2003 18:58:27 
 Re: bash   Alexey Vyskubov   02 Jun 2003 19:12:17 
 Re: bash   Aleksey Cheusov   02 Jun 2003 19:27:32 
 Re: bash   Victor Wagner   03 Jun 2003 09:05:28 
 Re: bash   Aleksey Cheusov   03 Jun 2003 12:58:29 
 Re: bash   Dennis Vshivkov   03 Jun 2003 14:30:01 
 Сколько иметь шеллов в системе? (was: bash)   Alexey Vyskubov   30 May 2003 11:14:11 
 Re: Сколько иметь шеллов в системе? (was: bash)   Evgenii Terechkov   28 May 2003 21:44:31 
 Re: bash   Michael Shigorin   30 May 2003 00:05:46 
 Re: bash   Evgenii Terechkov   29 May 2003 05:47:40 
 Re: bash   Valentin Nechayev   27 May 2003 22:37:13 
 bash   Evgenii Terechkov   28 May 2003 18:04:55 
 Re: bash   Valentin Nechayev   26 May 2003 21:39:19 
 Re: bash   Evgenii Terechkov   27 May 2003 06:00:24 
 Re[2]: bash   Alexandr S. Agranovsky   31 May 2003 11:55:31 
 Re: bash   Evgenii Terechkov   29 May 2003 23:12:07 
 bash   Evgenii Terechkov   30 May 2003 11:07:18 
Архивное /ru.linux/73688dab5c55.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional