Команда чтения bash.читать строку до символа ^ @ (как я могу видеть в vim), а другая часть строки игнорируется - PullRequest
0 голосов
/ 02 марта 2012

Я пытаюсь прочитать / dev / stdin, используя команду read. Но часть строк не читается Что я делаю не так? Строки читаются как символ ^ @

#!/bin/bash
echo "Content-Type: text/plain"
echo
IFS=$'\n'
while read -d $'\n'
do
echo $REPLY
done

POST http://79.135.220.173/post.png ОТВЕТ http://79.135.220.173/response.png

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

^@ - разборчивое представление нулевого символа 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, могут содержать встроенные нулевые символы.

Или вы можете сделать так, чтобы ввод не содержал нулевых символов?

0 голосов
/ 02 марта 2012

read будет читать из стандартного ввода (или любого другого дескриптора, указанного вами с помощью -u), пока он не встретит символ новой строки (или любой другой, указанный вами с помощью -d), разделив то, что читается на символы в IFS, и присвоение каждого токена указанным переменным или REPLY, если ни одна не была указана. Последняя переменная всегда получает все оставшиеся данные, которые были прочитаны.

Итак, поскольку вы не указали -d, тогда REPLY должен содержать для вас весь ввод до первого символа новой строки. Это будет происходить один раз за цикл, поэтому ваш сценарий должен читать и отображать каждую отправленную ему строку и никогда не завершаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...