Программа, которая может буферизовать 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 

  • Как создать реальную копию дескриптора файла stdout и stderr без использования unbuffer / script / tee только с встроенными встроенными в bash?
  • Как я могу захватить stdout / stderr в файле, но все еще вижу его в моей консоли?
  • vimdiff для сравнения вывода вместо файлов
  • Может ли написать stdout место противодавления в процессе?
  • Трубы, как поток данных в трубопроводе?
  • Команда для вывода содержимого файла в stdout?
  • Как сохранить распечатку последней команды в переменной оболочки в urxvt / zsh?
  • Как заставить программы python вести себя как соответствующие инструменты unix?
  • 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 
    Linux и Unix - лучшая ОС в мире.