Ты не делаешь ничего плохого: это то, чего мы должны ожидать.
Первый cat <&0
потребляет все содержимое стандартного входа, потому что именно это и делает cat
: он считывает все свои входные данные до конца.
Когда запускается второй cat <&0
, на стандартном входе ничего не остаётся: конец файла уже был достигнут раньше.
Если в скрипте оболочки вам нужно сделать 2 или более проходов через стандартный вход, вы должны сбросить его в временный файл, а затем обрабатывать временный файл столько раз, сколько вам нужно.
Безопасное создание временных файлов в /tmp
и обеспечение их правильной утилизации, когда ваш скрипт завершается или умирает, является для вас упражнением :-)
Кстати, <&0
является ненужным и ничего не делает. Его функция заключается в том, чтобы направить стандартный ввод на файловый дескриптор 0... который является стандартным вводом... который по определению является тем, где стандартный ввод уже указывает! Вместо этого можно просто выполнить эту команду cat
.
Если вы хотите читать со стандартного входа дважды, вам нужно как-то его буферизировать (скорее всего, во временном файле). Первый cat
можно заменить вызовом tee
, который также записывает данные в файл, который можно перечитать вторым вызовом cat
(в этом нет необходимости; sed
может читаться непосредственно из файла).
tee > input_buffer # Copy standard input to a file and standard output
echo Content length is $CONTENT_LENGTH
sed -e 's/&/\n/g' input_buffer | cut -d = -f2