[freebsd] test и пустые строки
Irina Liakh
spell at itl.ua
Tue Nov 21 11:40:47 EET 2017
Валентин, моё почтение за Ваше объяснение :)
Даже жалко скипать, но, наверное, надо.
On Tue, Nov 21, 2017 at 07:56:44AM +0200, Valentin Nechayev wrote:
>
> Tue, Nov 21, 2017 at 01:34:30, spell wrote about "Re: [freebsd] test и пустые строки":
>
> > > Я бы перефразировал: всплыло некорректное использование команды test.
> >
> > О, это всё объясняет :) Спасибо.
> > Только ни разу не очевидно, что null string в случае "[ $str ]" допустим,
> > а в случае "[ -n $str ]" - нет. И тем более что оно молча fallback-ает в
> > treating an option as a regular string.
>
> А какой собственно у неё выход?
Согласна, но почему бы об этом не упомянуть в мане? Сэкономило бы много
времени не только мне. А лучше переписать 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.
> А теперь о случаях типа один аргумент, который проверяет на непустоту.
> Тут одновременно и наследие (в смысле legacy), и простой сокращённый
> случай - но это уже фактически та простота, которая не то хуже
> воровства, не то "просто" требует очень внимательного отношения к
> себе.
Эта "простота" мне вчера оказалась полезной :)
Кмк,
[ `somelongcommandline` ] && dosomething || doother
выглядит получше чем
[ -n "`somelongcommandline`" ] && dosomething || doother
> Как и вообще многое в шелле и вокруг. Test тут далеко не
> единственный пример. Возьмём grep. Мы можем десятки раз писать что-то
> типа "grep vasya /var/log/auth.log", но если шаблон приходит снаружи,
> мы обязаны написать:
>
> grep -e "$pattern" "$file"
>
> причём важны и -e - указать, что тут шаблон, и кавычки - чтобы шелл
> сохранил это одним аргументом, независимо от количества параметров в
> нём.
С grep всё очевидно и согласно процедурам word expansion и quote removal.
> В случае test имеем несколько наслоений интерфейса - да, таки это
> legacy. Первый, самый ранний, это тот самый одноаргументный вариант и
> прочее связанное с ним.
А что ещё связано с одноаргументным вариантом?
> Стандарт можете почитать сами тут:
> http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
Спасибо!
> а дальше посмотреть на то, как более дружественные шеллы (bash,
> zsh...) борются с последствиями этого. Как они расширяют сам test,
> как эмпирически пытаются разбирать сложные случаи, как вместо этого
> можно пользоваться конструкциями типа $((...)), и так далее.
С $(( )) связана отдельная боль...
За вот это:
$ echo $(( 010 ))
8
повбывавбы...
Ну что мешало добавить буковку "o" аналогично "x" в хексе?:
$ echo $(( 0x10 ))
16
Ведущие нули не так уж редко используются в числах, где подразумевается
именно десятичное число (для выравнивания сортировки, например).
> (Если бы мне дали это всё исправить, я бы сделал вариант с только
> префиксной записью всех вариантов (например, `= arg1 arg2' вместо `arg1
> = arg2'), начальную опцию для него, и загнал бы это кувалдой в стандарт.
Да-да..
Если бы мне дали всё исправить, я бы начала с того, что 0 - это true,
а 1 - false. (начиная с машинной логики, а не только в шеллах)
More information about the freebsd
mailing list