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

Чтобы проверить это, нужно создать отдельного (непривилегированного) пользователя и запустить программу от имени этого пользователя.

12
13.01.2017, 12:25
8 ответов

Губка бедняка с использованием awk :

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

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

... | tac | tac
21
27.01.2020, 19:54

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

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

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


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

sed ':l;N;bl'
6
27.01.2020, 19:54

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

sed -n 'H;${x;s/^\n//;p}'
4
27.01.2020, 19:54

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

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

cmd | sponge filename

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

31
27.01.2020, 19:54

Та же идея, что и в примере с awk для 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
1
27.01.2020, 19:54

Запрашиваемое поведение, разве это не стандартное поведение простого кота?

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:$
0
27.01.2020, 19:54

Вы можете использовать следующие:

#!/bin/bash
stdin="$(cat /dev/stdin ; echo. )"
# To preserve newlines at the end we add a "." above and remove it below. See: https://unix.stackexchange.com/a/383411/62628
stdin=${stdin%.}
echo -n "$stdin"
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
line 1
line 2
line 3
$ buffered-cat

Но поскольку команда называется bufferred-cat, вы можете захотеть передать все параметры cat. В этом случае:

#!/bin/bash
stdin="$(cat /dev/stdin ; echo. )"
stdin=${stdin%.}
cat "$@" <(echo -n "$stdin")
$ buffered-cat -n
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
    1 line 1
    2 line 2
    3 line 3
$ buffered-cat
1
22.03.2021, 17:14

Тривиальная замена одной -линейной губки -в Perl:

perl -e 'print <>'

(от @dave _thompson _085, в комментарии )

Perl также должен уметь работать с нулевыми байтами.

1
22.03.2021, 17:38

Теги

Похожие вопросы