добавление этих опций в docker exec решило мою проблему
-e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM
'$
ничего особенного не означает. С %d
в printf
он пытается оценить аргумент как целочисленное выражение. 'a
принимается заchar
a
или целое число 97. Вы получите тот же результат, даже если не используете раскрытие переменных:
$ printf %d\\n "'a'"
97
$ printf %d\\n "'0'"
48
$ printf %d\\n "'"$'\1'
1
Из документации bash наprintf
(упор мой):
Arguments to non-string format specifiers are treated as C language constants, except that a leading plus or minus sign is allowed, and if the leading character is a single or double quote, the value is the ASCII value of the following character.
Любые оставшиеся символы игнорируются, как указано в комментариях.
'
является частью аргумента printf (см. раздел «Аргументы» здесь).
$
является частью обычного расширения оболочки, поэтому аргументы printf
становятся %d
и 'a
.
Наконец, конструкция $(...)
представляет собой подстановку команд , что в данном случае означает, что NUM
имеет значение, установленное на выходе функции printf
.