test parsing failures

From
Valentin Nechayev ()
To
All ()
Date
2003-06-02T07:36:52Z
Area
RU.UNIX.PROG
From: Valentin Nechayev <netch@segfault.kiev.ua>

Ку,
mojet, starO, no ja ne naryvalsa, a problema jest'...

----- Forwarded message from Maxim Razin <Maxim.Razin@p256.f178.n4641.z2.fidonet.org> -----

Newsgroups: fido7.ru.linux
X-Comment-To: Valentin Nechayev
From: Maxim Razin <Maxim.Razin@p256.f178.n4641.z2.fidonet.org>
Date: Sun, 01 Jun 2003 11:37:38 +0400
Subject: [[b]a]sh, '$@' без кавычек --  признак ошибки
Message-ID: <1054471947@p256.f178.n4641.z2.ftn>
Organization: Too lazy to change a newsreader

Hello Valentin!

01 Jun 03 10:47, Valentin Nechayev wrote to Aleksey Cheusov:

 VN> Опять-таки, это причина ставить кавычки, но не дописывать 'x' 
 VN> спереди.

Но даже это не всегда помогает, по крайней мере, с bash.  Результат
эксперимента:

~$ touch "="

Пробуем test, встроенный в bash

~$ test -f = ; echo $?
0
~$ test -f = -f ; echo $?
0

Итак, фюрер думает за нас, выбирая из унарного и бинарного оператора более
"подходящий".  Попробуем его слегка озадачить:

~$ test -r = -a -w = ; echo $?
test: too many arguments
2

Дело в том, что первые три слова он воспринимает как сравнение:

~$ test -r = -a
1

Предположим, что file="=".  Тогда безобидная команда приобретает интересный
смысл.

~$ test -r "$file" -a -w "$file"; echo $?
test: too many arguments
2

~$ bash --version
GNU bash, version 2.05a.0(1)-release (i686-pc-linux-gnu)
Copyright 2001 Free Software Foundation, Inc.

Попробуем теперь /usr/bin/test

~$ /usr/bin/test -f = ; echo $?
0
 
и т.д. дает идентичные результаты

~$ /usr/bin/test --version
test (GNU sh-utils) 2.0.11
Written by FIXME: ksb and mjb.

Copyright (C) 2000 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Воистину искусственный интеллект давить :)

Regards,
Maxim


----- End forwarded message -----

Проверил - таки маразм. Причём даже скобки не помогают:

==={{{ (это уже из меня)

$ test \( -r = \) -a \( -w = \); echo $?
bash: test: `)' expected
2
(bash 2.05b.004)

/bin/test из FreeBSD это взял. zsh 4.0.4 - нет:

18:59:04:netch@iv:/var/tmp/bt_>test \( -r = \) -a \( -w = \); echo $?
test: argument expected
1

А вот ksh снова взял:

$ test \( -r = \) -a \( -w = \); echo $?
0

М-да.

===}}}

Собственно, в SUSv3 слишком много "unspecified" по правилам разбора
конструкций длиннее чем в 4 элемента, так что тут они отмазались. :(


-netch-
--- ifmail v.2.15dev5
 * Origin: Dark side of coredump (2:5020/400)