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)