bash позволяет расширение $'string'
, Мой man bash
говорит:
Слова формы
$'string'
рассматриваются специально. Слово расширяется доstring
, при этом символы с обратным слэшем-экранированием заменяются в соответствии со стандартом ANSI C. Последующие последовательности обратного слэша, если они есть, декодируются следующим образом:
\a
предупреждение (звонок)
\b
backspace
\e
\e
escape-символ
\f
feed feed\n
новая строка
\r
возврат каретки
\t
горизонтальная вкладка
\v
вертикальная вкладка
\
обратная косая черта
\'
одинарная цитата
\"
двойная цитата
\nnn
восьмибитовый символ, значением которого является восьмеричное значениеnnn
(от одной до трех цифр)
\xHH
восьмибитовый символ, значение которого представляет собой шестнадцатеричное значениеHH
(одна или две шестнадцатеричные цифры)
\cx
символ управленияx
Расширенный результат одинарный, как будто знак доллара не присутствовал.
Но почему bash не преобразовать $'\0'
и $'\x0'
в нулевой символ?
Документировано? Есть ли причина? (Является ли это функцией или ограничением или даже ошибкой?)
$ hexdump -c <<< _$'\0'$'\x1\x2\x3\x4_'
0000000 _ 001 002 003 004 _ \n
0000007
echo
дает ожидаемый результат:
> hexdump -c < <( echo -e '_\x0\x1\x2\x3_' )
0000000 _ \0 001 002 003 _ \n
0000007
Моя версия bash
$ bash --version | head -n 1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Почему echo $'foo\0bar'
не ведет себя как echo -e 'foo\0bar'
?