bash не может хранить hexvalue 0x00 в переменной

Я пытаюсь сделать некоторые трюки с dd. Я думал, что можно будет хранить некоторые шестнадцатеричные значения в переменной, называемой «header», чтобы передать ее в dd.

Мой первый шаг без переменной состоял в следующем:

$ echo -ne "\x36\xc9\xda\x00\xb4" |dd of=hex $ hd hex 00000000 36 c9 da 00 b4 |6....| 00000005 

После этого я попробовал это:

 $ header=$(echo -ne "\x36\xc9\xda\x00\xb4") $ echo -n $header | hd 00000000 36 c9 da b4 |6...| 00000004 

Как вы можете видеть, я потерял значение \x00 в переменной $header . У кого-нибудь есть объяснение этого поведения? Это сводит меня с ума.

2 Solutions collect form web for “bash не может хранить hexvalue 0x00 в переменной”

Вы не можете хранить нулевой байт в строке, потому что Bash использует строки стиля C, которые резервируют нулевой байт для терминаторов. Поэтому вам нужно переписать свой скрипт, чтобы просто передать последовательность, содержащую нулевой байт, без необходимости использовать Bash в середине. Например, вы можете сделать это:

 printf "\x36\xc9\xda\x00\xb4" | hd 

Обратите внимание, кстати, что вам не нужно echo ; вы можете использовать printf Bash для этого множество других простых задач.

Или вместо цепочки вы можете использовать временный файл:

 printf "\x36\xc9\xda\x00\xb4" > /tmp/mysequence hd /tmp/mysequence 

Конечно, проблема в том, что файл /tmp/mysequence может уже существовать. И теперь вам нужно создавать временные файлы и сохранять их пути в строках.

Или вы можете избежать этого, используя замену процесса:

 hd <(printf "\x36\xc9\xda\x00\xb4") 

Оператор <(command) создает именованный канал в файловой системе, который будет получать вывод command . hd получит в качестве своего первого аргумента путь к этому каналу, который он откроет и прочитает почти как любой файл. Подробнее об этом можно узнать здесь: https://unix.stackexchange.com/a/17117/136742 .

Вместо этого вы можете использовать zsh который является единственной оболочкой, которая может хранить символ NUL в своих переменных. Этот символ даже оказывается в стандартном значении $IFS в zsh .

 nul=$'\0' 

Или:

 nul=$'\x0' 

Или

 nul=$'\u0000' 

Или

 nul=$(printf '\0') 

Однако обратите внимание, что вы не можете передавать такую ​​переменную, как переменную аргумента или среды, в команду, которая выполняется в качестве аргументов и переменных среды, являются строками с NUL-разделителями, переданными execve() вызову execve() (ограничение API системы, а не оболочкой). В zsh вы можете передавать NUL байты в качестве аргументов для функций или встроенных команд.

 echo $'\0' # works /bin/echo $'\0' # doesn't 
  • Почему этот сценарий не работает?
  • bash - Функция escape-символа?
  • Как я могу загрузить функции этого файла скрипта, не загружая его каждый раз? «Команда не найдена» (основы Bash / scripting)
  • Ошибка при вычитании двух отрицательных чисел в ksh: «назначение требует lvalue»
  • Если #head versionnumber.txt <#head lastversionnumber.txt, то: сделайте это
  • Оболочка сценария скрипта условно
  • Выйти из Google Chrome с терминала
  • Как проверить, является ли данный путь файлом или каталогом
  • Скрипт для отправки почты, если в журнале не было записи в течение определенного времени
  • Как преобразовать несколько изображений tiff в координаты xyz в одном текстовом файле с помощью терминала?
  • Ошибка при синтаксисе рядом с неожиданным токеном `('?"
  • Linux и Unix - лучшая ОС в мире.