Программа, которая может буферизовать stdin или файл

Помимо использования временного файла, который может помочь, существует ли способ / программа, способный записывать входные данные из stdin но не выводит содержимое до получения EOF . Я также не хочу использовать переменную оболочки (например, buffer=$(cat) ).

Эта программа должна вести себя следующим образом (предположим, что имя программы buffered-cat ):

 $ buffered-cat line 1 line 2 line 3 ^D # Ctr-D here(End of Line) 

Теперь, когда программа получила ^D , buffered-cat выводит содержимое

 line 1 line 2 line 3 

6 Solutions collect form web for “Программа, которая может буферизовать stdin или файл”

sponge бедняка с помощью awk :

 awk '{a[NR] = $0} END {for (i = 1; i <= NR; i++) print a[i]}' 

Если у вас есть tac , вы также можете злоупотреблять им:

 ... | tac | tac 

Вы можете сделать это с помощью sponge из более полезных продуктов . sponge будет «впитывать стандартный ввод и записывать в файл». Без аргументов этот файл является стандартным. Ввод, заданный этой команде, сохраняется в памяти до EOF, а затем записывается все сразу.

Для записи в обычный файл вы можете просто указать имя файла:

 cmd | sponge filename 

Основная цель sponge – разрешить чтение и запись из одного и того же файла в конвейере, но он делает то, что вы хотите.

Пока ваш ввод ASCII-текста (не содержит NUL 0x0 байт до конца), тогда sed -z делает то, что вы хотите:

 $ sed -z '' Line 1 Line 2 Line 3 ^D Line 1 Line 2 Line 3 $ 

-z заставляет sed обрабатывать байт NUL в качестве разделителя строк вместо обычной новой строки. До тех пор, пока ваш ввод является обычным текстом без байтов NUL, тогда sed продолжит считывать весь ввод в свой буфер шаблонов до тех пор, пока не будет достигнута EOF. sed не выполняет обработку буфера и выводит его.


Если в вашем входе присутствуют NUL байты, вы можете сделать это вместо этого:

 sed ':l;N;bl' 

Это решение sed немного больше, чем DigitalTrauma, но также работает с NUL байтами.

 sed -n 'H;${x;s/^\n//;p}' 

Поведение, о котором вы просите, не является ли поведение по умолчанию простым котом?

 gv@debian:$ cat << EOF #or cat <<EOF >file or cat <<EOF >/dev/stdout > Line 1 > Line 2 > Line 3 > EOF Line 1 Line 2 Line 3 gv@debian:$ 

Та же идея, что и пример awu muru, кроме Python. Используйте Ctrl D, чтобы прекратить чтение строк

 $ python -c 'import sys;print("".join(sys.stdin.readlines()))' line1 line2 line3 # press Enter and Ctrl+D at this point line1 line2 line3 
  • Может перенаправлять stdout и stderr в те же строки, что и строки?
  • Имеются ли отчеты о ходе выполнения / данные регистрации на stderr или stdout?
  • Как замедлить прокрутку многостраничного стандартного вывода на терминал?
  • Unix без / dev / stdin, / dev / stdout и / dev / stderr?
  • Перенаправить stdout программы командной строки Windows под вином
  • Команда, которая генерирует как стандартную ошибку, так и вывод
  • Почему опция -v с rm показывает записи с обратным отсчетом и обычной цитатой?
  • Перенаправление stderr скрипта Ruby не работает должным образом
  • Подавлять сообщения о запуске на stdout?
  • stdout, stderr и протоколирование с помощью команды script
  • Может ли написать stdout место противодавления в процессе?
  • Проблемы с перенаправлением вывода приложения в файл журнала
  • Interesting Posts

    Является ли виртуальная консоль рассмотренным процессом на ядре ОС?

    Как я могу передавать входные данные из одной сессии SSH в другую? Используя fifo?

    .xsession и .xinitrc не выполняются при входе в систему

    Как создать загрузочный USB-сервер для Ubuntu Server?

    Настройка прозрачного представления через файловый менеджер nautilus

    Как проверить загрузку FreeBSD iso?

    Выгода от модуля ядра, скомпилированного внутри ядра?

    Есть ли способ интегрировать «man-страницы» unix в приложение «Словарь OSX»?

    разрешить db-связь через внутренний ip

    Почему не удается установить пакеты в Synaptic Debian 8.5?

    Почему это правило udev не срабатывает при удалении устройства?

    Как загружать файлы с удаленного сервера Linux (Ubuntu)?

    Как я могу получить коэффициент разницы с помощью «diff» или другой команды?

    Попытка запускать команду при загрузке, но не работает

    Может ли `make` автоматически устанавливать зависимости?

    Linux и Unix - лучшая ОС в мире.