недокументированная фича bash?

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

недокументированная фича bash?

Сообщение SLEDopit »

Код: Выделить всё

V=1 ; [[ V -eq 1 ]] && echo TRUE

возвращает TRUE.
Как я понимаю, вместо V подставляется 1, даже без $ перед V, потому что используется -eq.
Но нигде в документации (man, info, google) ничего подобного я не нашёл.
Забыли написать или я плохо искал?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: недокументированная фича bash?

Сообщение Lan4 »

Вместо V подставляется

Код: Выделить всё

bash: V: command not found

;)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: недокументированная фича bash?

Сообщение SLEDopit »

Lan4 писал(а):
25.05.2012 22:28
Вместо V подставляется
А версия bash?
У меня 4.2.20. И подставляется именно значение.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1147
Статус: Slacker!
ОС: Slackware64-current

Re: недокументированная фича bash?

Сообщение yars »

SLEDopit писал(а):
25.05.2012 22:33
А версия bash?

Интересно, у меня тоже отрабатывает как у вас, версия bash - 3.1.17(2)-release
Slackware64-current/Xfce/Xiaomi Mi Notebook Pro 15.6 | Arch Linux/Xfce/Lenovo G580
-------------
Registered Linux User #557010
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: недокументированная фича bash?

Сообщение Lan4 »

SLEDopit писал(а):
25.05.2012 22:33
А версия bash?
У меня 4.2.20. И подставляется именно значение.

Такс, а как глянуть, что там подставляется?..
А, понял... Думал отмазаться тем, что

Код: Выделить всё

[[ V -eq 1 ]] && echo TRUE

тоже работает, но забыл, что перед этим V уже установлено 1. А если устанавливать 0, то работает как надо - т.е. ничего не выводит.

p.s.: про "bash: V: command not found" - это было просто предположение ;)
p.p.s.: bash 4.2.28
p.p.p.s.: все-таки фича ^^
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: недокументированная фича bash?

Сообщение watashiwa_daredeska »

SLEDopit писал(а):
25.05.2012 22:25
Но нигде в документации (man, info, google) ничего подобного я не нашёл.
on the words between the [[ and ]]; tilde expansion, parameter and variable
expansion, arithmetic expansion, command substitution, process substitution, and quote removal are per‐
formed.
Arithmetic Expansion

The evaluation is performed according to the rules listed below under ARITHMETIC EVALUATION.
ARITHMETIC EVALUATION

Within an expression, shell variables may also be referenced by name without using the parameter expansion syntax.
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: недокументированная фича bash?

Сообщение Nazyvaemykh »

GNU bash 4.4.28, эта ошибка присутствует, и только с [[, но не с test.
А так это даже не ошибка, а просто такой специфический юмор.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: недокументированная фича bash?

Сообщение watashiwa_daredeska »

Nazyvaemykh писал(а):
25.05.2012 23:23
эта ошибка присутствует, и только с [[, но не с test.
Это не ошибка. Так задумано. «[[» — это не тоже самое, что «[».
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: недокументированная фича bash?

Сообщение SLEDopit »

watashiwa_daredeska, спасибо.

Код: Выделить всё

$ V=V ; [[ V -eq 12 ]]
-bash: [[: V: expression recursion level exceeded (error token is "V")
эх, даже рекурсию предусмотрели :(
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: недокументированная фича bash?

Сообщение smaharbA »

x=1;x="x";z='x'; [[ $z -eq 1 ]] && echo 123;

яйца надо обрывать за такую предусмотрительность
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: недокументированная фича bash?

Сообщение serzh-z »

smaharbA
bash: [[: x: expression recursion level exceeded (error token is "x")


Хм, и правда.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: недокументированная фича bash?

Сообщение ZyX »

smaharbA писал(а):
27.08.2012 23:57
x=1;x="x";z='x'; [[ $z -eq 1 ]] && echo 123;

яйца надо обрывать за такую предусмотрительность
Нет ничего удивительного, что у вас не получается когда вы всё делаете неправильно. Обычные переменные — это просто строки. Никакого мотива подставлять вместо строки x строку 1 у bash нет, зато есть мотив ничего не подставлять (стандарт). Но можно сделать так, чтобы мотив появился:

(Created by format.vim)

typeset -i x x=1 x=x z=x [[ z -eq 1 ]] && echo True

выведет True.

Вообще, на каком основании вы ожидали чего‐то ещё? Когда вы делаете x="x" новым значением x становится x. Откуда bash возьмёт 1 вместо x? В моём примере просто 1 подставляется вместо x на этапе присваивания, сама переменная никогда не получает значения x. В вашем bash пытается это сделать на этапе проверки, что, естественно не работает — x уже ссылается на саму себя.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: недокументированная фича bash?

Сообщение drBatty »

ZyX писал(а):
01.01.2013 18:49
Нет ничего удивительного, что у вас не получается когда вы всё делаете неправильно. Обычные переменные — это просто строки. Никакого мотива подставлять вместо строки x строку 1 у bash нет, зато есть мотив ничего не подставлять (стандарт). Но можно сделать так, чтобы мотив появился:

что-бы появился мотив подставлять именно $x, можно сделать и так:

$

x=123; (( z = x )); echo $z 123


в ((двойных скобках)) тоже работает эта фича. В точности как и в [[таких скобках]].

$

x=123; [[ x -eq 123 ]] && echo True True


ZyX писал(а):
01.01.2013 18:49
В вашем bash пытается это сделать на этапе проверки, что, естественно не работает — x уже ссылается на саму себя.

точнее $z содержит 'x'. А $x тут вообще не причём.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: