|
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 |
|
|