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

  • где находится stdin, stdout, дескриптор файла stderr в AIX (unix)
  • перенаправление stdout. sh: ресурс временно недоступен
  • в сценарии bash; процесс stdout как аргумент имени файла терпит неудачу, когда вы открываете его более одного раза
  • выборочный stdout, stderr и ведение журнала с помощью команды script
  • Объединить два результата команды в одну строку при перенаправлении stdout
  • Правда ли, что существует 4 типа ** вывода **, мы можем ссылаться на файл в Linux?
  • Печать stderr только в том случае, если в stdout ничего не записано, иначе распечатайте только stdout, отбрасывая stderr
  • Как добавить новые строки при использовании эха
  • 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 - лучшая ОС в мире.