Как уже говорили другие, вы не можете хранить / использовать NUL char :
- в переменной
- в аргументе командной строки.
Однако, вы можете обрабатывать любые двоичные данные (включая NUL-символ):
Итак, чтобы ответить на ваш последний вопрос:
может кто-нибудь подсказать, как могут быть строки, содержащие \ 0 символов
хранится или обрабатывается эффективно, не теряя (мета) символов?
Вы можете использовать файлы или каналы для эффективного хранения и обработки любой строки с любыми метасимволами.
Если вы планируете обрабатывать данные, вам следует дополнительно отметить, что:
Обход ограничений
Если вы хотите использовать переменные, то вы должны избавиться от NUL-символа путем его кодирования, а различные другие решения здесь предлагают умные способы сделать это (очевидный способ - использовать, например, кодирование / декодирование base64).
Если вас беспокоит память или скорость, вы, вероятно, захотите использовать минимальный синтаксический анализатор и указывать только символ NUL (и символ цитирования). В этом случае вам помогут:
quote() { sed 's/\\/\\\\/g;s/\x0/\\x00/g'; }
Затем вы можете защитить свои данные, прежде чем сохранять их в переменных и
аргумент командной строки, передавая ваши конфиденциальные данные в quote
, который выведет безопасный поток данных без символов NUL. Вы можете вернуться
исходная строка (с NUL-символами) с помощью echo -en "$var_quoted"
, которая отправит правильную строку в стандартный вывод.
* +1057 * Пример:
## Our example output generator, with NUL chars
ascii_table() { echo -en "$(echo '\'0{0..3}{0..7}{0..7} | tr -d " ")"; }
## store
myvar_quoted=$(ascii_table | quote)
## use
echo -en "$myvar_quoted"
Примечание: используйте | hd
, чтобы получить чистое представление ваших данных в шестнадцатеричном и
убедитесь, что вы не потеряли NUL-символы.
Смена инструментов
Помните, что вы можете довольно далеко зайти с конвейерами, не используя переменные и аргументы в командной строке, не забудьте, например, конструкцию <(command ...)
, которая создаст именованный канал (своего рода временный файл).
РЕДАКТИРОВАТЬ: первая реализация quote
была неправильной и не будет корректно работать с \
специальными символами, интерпретируемыми echo -en
. Спасибо @xhienne за то, что заметил это.
EDIT2: во второй реализации quote
была ошибка из-за использования только \0
, из-за чего на самом деле было бы съедено больше нулей, например \0
, \00
, \000
и \0000
эквивалентны. Так \0
было заменено \x00
Спасибо за @MatthijsSteen за то, что нашли это.