Откуда происходит рекурсивное расширение переменных в числовом контексте bash / shell?

В спецификации POSIX говорится оАрифметическое Расширение тот

[i] Если переменная оболочки x содержит значение, которое образует допустимую целочисленную константу, необязательно включая начальный знак плюс или минус, то арифметические расширения "$ ((x))" и "$ (($ x))" должны вернуть то же значение.

Что является разумным сокращением и довольно хорошо убирает сложные выражения.

Баш (версии3.2.25(1)-release из CentOS 5 и4.3.33(1)-release из нестабильного Debian), а также ksh (Version AJM 93t+ 2010-06-21 от CentOS 5) все, кажется, идет на шаг дальше, чем это, однако.

Кажется, что все они рекурсивно раскрывают переменные, встречающиеся в арифметическом раскрытии (и числовые контексты в[[ в результате использования числовых операторов).

В частности:

$ set -x
$ bar=5
+ bar=5
$ foo=bar
+ foo=bar
$ [ foo -gt 4 ]; echo $?
+ '[' foo -gt 4 ']'
-bash: [: foo: integer expression expected
+ echo 2
2
$ [[ foo -gt 4 ]]; echo $?
+ [[ foo -gt 4 ]]
+ echo 0
0
$ [[ foo -eq 0 ]]; echo $?
+ [[ foo -eq 0 ]]
+ echo 1
1
$ [[ foo -eq 5 ]]; echo $?
+ [[ foo -eq 5 ]]
+ echo 0
0
$ (( foo == bar )); echo $?
+ ((  foo == bar  ))
+ echo 0
0
$ (( foo == 1 )); echo $?
+ ((  foo == 1  ))
+ echo 1
1

Откуда такое поведение и почему оно было бы желательным?

Это делает использование[[ на месте[ эксплицитноМеньше безопасен при использовании с числовыми операторами, потому что недопустимые значения и типографские ошибки превращаются из ошибок скрипта в бесшумные (но, вероятно, ошибочные) тесты.

Редактировать: В качестве дополнительного вопроса, если кто-то знает,когда эта "особенность" была добавлена ​​в bash / etc. Мне было бы интересно это знать.

Ответы на вопрос(1)

Ваш ответ на вопрос