[freebsd] test и пустые строки

Valentin Nechayev netch at netch.kiev.ua
Tue Nov 21 11:55:06 EET 2017


hi,

 Tue, Nov 21, 2017 at 11:40:47, spell wrote about "Re: [freebsd] test и пустые строки": 

> Валентин, моё почтение за Ваше объяснение :)
> Даже жалко скипать, но, наверное, надо.

То не то чтобы объяснение, скорее оправдание :)
С моей точки зрения, шелл вообще в принципе нелогичный зверь. Два
самых известных варианта, как его замкнуть до адекватного состояния,
зовутся Perl и Tcl.

> Согласна, но почему бы об этом не упомянуть в мане? Сэкономило бы много
> времени не только мне. А лучше переписать usage syntax.
> Вот эта строка:
> 
>      string        True if string is not the null string.
> 
> и работающая конструкция "[ ]" дают надежду на то, что аргументы могут
> быть null'ами (это если не задумываться о реализации и наследии).
> Поскольку в околошелльных кругах нет устоявшихся понятий
> "null string", "zero string", "initialized variable" (нет же?), то
> описание типа такого, кмк, было бы более прозрачным:
> 
>      [string]      True if string is specified and it's length is not zero.

Да, тут понятие null string требует расшифровки или замены на более
понятное, типа empty string.

> > А теперь о случаях типа один аргумент, который проверяет на непустоту.
> > Тут одновременно и наследие (в смысле legacy), и простой сокращённый
> > случай - но это уже фактически та простота, которая не то хуже
> > воровства, не то "просто" требует очень внимательного отношения к
> > себе.
> 
> Эта "простота" мне вчера оказалась полезной :)
> Кмк,
> 
> [ `somelongcommandline` ] && dosomething || doother
> 
> выглядит получше чем
> 
> [ -n "`somelongcommandline`" ] && dosomething || doother

Мнэээ... вообще-то это уже диверсия. Например:

$ a() { echo 1 -eq 3; }
$ [ `a` ] && echo yes || echo no
no
$ a() { echo 1 -ne 3; }
$ [ `a` ] && echo yes || echo no
yes
$ a() { echo 1 2 3; }
$ [ `a` ] && echo yes || echo no
bash: [: 2: binary operator expected
no

то есть отсутствием закавычивания Вы уже пришли к тому, что
`somecommand` может выдавать несколько разделённых пробелом слов,
которые будут рассматриваться отдельно.
Это крайне хрупко и может быстро привести к настоящим дырам в
безопасности.
Я в таких случаях _никогда_ не надеюсь на постулаты типа "эта команда
никогда не выдаст более одного слова"; если где-то записано `x` вместо
"`x`", это следует считать прямой командой шеллу перепарсить вывод, а
такие команды не надо использовать, если нет на то прямого указания.

> > Как и вообще многое в шелле и вокруг. Test тут далеко не
> > единственный пример. Возьмём grep. Мы можем десятки раз писать что-то
> > типа "grep vasya /var/log/auth.log", но если шаблон приходит снаружи,
> > мы обязаны написать:
> > 
> > grep -e "$pattern" "$file"
> > 
> > причём важны и -e - указать, что тут шаблон, и кавычки - чтобы шелл
> > сохранил это одним аргументом, независимо от количества параметров в
> > нём.
> 
> С grep всё очевидно и согласно процедурам word expansion и quote removal.

Это про кавычки, а я также про -e для шаблона, который может
начинаться с '-'.
Ну и если "всё очевидно", то что мешает упростить работу шеллу в
случае test?

> > В случае test имеем несколько наслоений интерфейса - да, таки это
> > legacy. Первый, самый ранний, это тот самый одноаргументный вариант и
> > прочее связанное с ним.
> 
> А что ещё связано с одноаргументным вариантом?

С самым ранним, а не с одноаргументным. В первую очередь это та же
логика "ищем операцию согласно количеству аргументов", которая не
расширяема на более сложные случаи.

> С $(( )) связана отдельная боль...
> За вот это:
> 
> $ echo $(( 010 ))
> 8
> 
> повбывавбы...
> 
> Ну что мешало добавить буковку "o" аналогично "x" в хексе?:

+100. Самое ужасное, что это переносят и в новейшие языки (например, Go).

> Да-да..
> Если бы мне дали всё исправить, я бы начала с того, что 0 - это true,
> а 1 - false. (начиная с машинной логики, а не только в шеллах)

Вот тут не согласен. В шелле такая логика потому, что успешных
завершений один код, а неуспешных - много. Но именно поэтому она
обратная. И не везде она такая (вон в Windows положительные коды -
успех, отрицательные - ошибка, и в обоих множествах 2 миллиарда
возможностей).


-netch-


More information about the freebsd mailing list