[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