^@
- разборчивое представление нулевого символа ASCII.
C использует нулевой символ в качестве ограничителя строки, а bash реализован на языке C.
Скорее всего bash's read
Функция считывает всю строку в буфер, который назначен $REPLY
.Когда этот буфер передается во встроенную команду echo
, он обрабатывает нулевой символ как терминатор строки.
Для кода в вашем вопросе вы можете использовать команду cat
вместо использования команды bashread
чтобы прочитать строку за раз.(cat
, по крайней мере, версия GNU coreutils, не имеет проблем с нулевыми символами):
#!/bin/bash
echo "Content-Type: text/plain"
echo
cat
Последняя команда cat
просто копирует стандартный ввод в стандартный вывод.
Если вам нужно выполнить некоторую обработку ввода перед его печатью, вы можете рассмотреть использование Perl вместо bash для этого скрипта;Строки Perl, в отличие от строк C, могут содержать встроенные нулевые символы.
Или вы можете сделать так, чтобы ввод не содержал нулевых символов?