Я хочу создать массив bash из ввода, разделенного NUL (из стандартного ввода).
Вот пример:
## Let define this for clarity
$ hd() { hexdump -v -e '/1 "%02X "'; echo ;}
$ echo -en "A B\0C\nD\0E\0" | hd
41 20 42 00 43 0A 44 00 45 00
Так что это мой вклад.
Теперь работа с NUL работает нормально, если не использовать команду -a
of read
:
$ while read -r -d '' v; do echo -n "$v" | hd; done < <(echo -en "A B\0C\nD\0E\0")
41 20 42
43 0A 44
45
Получаем правильные значения. Но я не могу сохранить эти значения, используя -a
:
$ read -r -d '' -a arr < <(echo -en "A B\0C\nD\0E\0")
$ declare -p arr
declare -a arr='([0]="A" [1]="B")'
Чего я явно не хотел. Я бы хотел:
$ declare -p arr
declare -a arr='([0]="A B" [1]="C
D" [2]="E")'
Есть ли способ использовать read -a
, и если он не работает, то почему? Знаете ли вы простой способ сделать это (избегая цикла while
)?
readarray
илиmapfile
поддерживали разделители NUL, но начиная с Bash 4.3 они этого не делают. Возможно, кто-то должен спросить Чета, будет ли принят патч... - person Charles Duffy   schedule 05.05.2014while
. Мне просто было интересно, почему это не сработало, и я не хотел убедиться, что я не упустил что-то очевидное. Любые детали (отчет об ошибке, ссылка на исходный код, ограничения ОС, подтверждение этого недостатка из источника), которые дадут больше информации о «почему»? - person vaab   schedule 05.05.2014-d
предоставляет разделитель, используемыйread -a
, чтобы сообщить ему, когда прекратить чтение полностью, а не когда прекратить чтение отдельной записи. Делает ли это поведение более понятным? - person Charles Duffy   schedule 05.05.2014