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 по мере их запуска?
  • Как проверить, монтируется ли файловая система с помощью скрипта
  • Изменение числового значения в файле с помощью Vim из сценария
  • Скрипт работает на Mac, но не Ubuntu
  • Перенаправить скрипт stderr и stdout в файл, но сохранить stdout в tty?
  • Замена переменной, содержащей \ with sed
  • bash для чтения первого аргумента в качестве входного файла и поиска переменной в другом файле по строкам
  • строковые манипуляции без awk или sed
  • Interesting Posts

    Есть ли способ запустить приложение в новом пространстве с помощью ярлыка?

    Схема раздела для установки Debian

    Почему не может / proc быть слоем файловой системы наложения (overlayfs) на linux?

    haproxy, обслуживающий неверный SSL-сертификат для субдомена

    Где я могу найти современную версию консольного шрифта «rock» (или «t»)?

    Система управления документами для Linux

    Puppy Linux на ноутбуке под управлением Ubuntu 14.04 (с двойной загрузкой)?

    Как изменить предыдущую / следующую комбинацию слов в bash?

    Правило udev для пользователей, не являющихся пользователями root, отменяющих драйверы pci?

    Является совместимым с SuperServer 6017R-72RFTP Debian?

    Обновление Java на Centos

    Mac Terminal – переименовать * .png.png в * .png

    Чтение из STDIN и непосредственное использование данных (при чтении) или открытие URL-адреса с помощью zbar

    debian: что такое «/var/log/apt/term.log», хорошо для

    Как удалить ранее перезаписанную ОС Ubuntu из меню Boot Option?

    Linux и Unix - лучшая ОС в мире.