Как читать двоичные данные, включая нулевые байты, с помощью встроенного чтения BASH?

Вы не можете переименовать корневой каталог файловой системы, и это то, что вам нравится делать.

Если вы монтируете файловую систему NFS -с базовой точкой монтирования, вы можете переименовать ее, поскольку это позволит вам увидеть непокрытую точку монтирования.

Фон :Если что-то монтируется в запись в файловой системе, это скрывает исходный файл, но вам потребуется переименовать исходный файл. То, что вы видите, является корневым каталогом смонтированной файловой системы, и его нельзя переименовать.

3
29.12.2020, 18:07
1 ответ

bashпеременные не могут хранить байты NUL (только zsh, хотя см. также ksh93printf %Bи typeset -bс использованием кодировки base64 ). Его встроенная функция readтакже будет пропускать байты NUL во входных данных.

Однако здесь можно использовать:

LC_ALL=C IFS= read -rd '' -n1 c

Это считывается до одного байта из записи с разделителями NUL -. Таким образом, если $cпусто, это означает, что либо EOF (, но тогда статус выхода readбудет не -нулевым ), либо был прочитан байт NUL.

Для обоих вы можете получить числовое значение этого байта с помощью:

LC_ALL=C printf -v value %d "'$c"

Так:

while
  IFS= LC_ALL=C read -rd '' -n1 c &&
    LC_ALL=C printf -v value %d "'$c"
do
  echo "Got byte with value $value"
done

Будет считывать ввод по одному байту за раз до EOF и поддерживать нулевые байты.

Или всегда можно:

value=$(dd bs=1 count=1 2> /dev/null | od -An -vtu1)

Или с некоторыми odреализациями:

value=$(od -N1 -An -vtu1)

Хотя это подразумевает разветвление дополнительных процессов и запуск внешних исполняемых файлов (, и если stdin является терминальным устройством, это не выведет его из режима icanon, как это делает read).

2
18.03.2021, 22:40

Теги

Похожие вопросы