Использование обрезанного нулевого символа внутри переменной

GNU bash, версия 4.3.42(1)-релиз

Попытка уменьшить нулевой символ, но bash, похоже, не сохраняет нулевой символ в переменной.

$ echo -e 'hello\0goodbye' > testlist
$ cat testlist | cut -d '' -f1
hello
$ foobar=$(echo -e 'hello\0goodbye'); echo "$foobar" | cut -d '' -f1
hellogoodbye

Я что-то не так делаю?

1 ответ

Bash встраивает двоичный ноль:

echo -e 'hello\0goodbye' | od -xc

дает:

0000000      6568    6c6c    006f    6f67    646f    7962    0a65        
       h   e   l   l   o  \0   g   o   o   d   b   y   e  \n  

хотя лично я предпочитаю \x00 нотации.

Это cut Программа, которая является проблемой. Таким образом, вы можете использовать awk язык вместо. Например:

awk -F '\0'  '{print $1}' testlist

(примечание: нет cat требуется) и:

foobar='hello\0goodbye'
echo -e "$foobar" | awk -F '\0'  '{print $1}'

оба дают:

hello

Тем не мение, \0 раскрывается в пустую строку (как описано в man bash) так

foobar=$(echo -e 'hello\0goodbye')

теряет ноль, как вы нашли.

Другие вопросы по тегам