Чтобы проверить это, нужно создать отдельного (непривилегированного) пользователя и запустить программу от имени этого пользователя.
Пока ваш ввод представляет собой текст 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'
Это решение sed
немного длиннее, чем у DigitalTrauma, но также работает с байтами NUL.
sed -n 'H;${x;s/^\n//;p}'
Вы можете сделать это с помощью sponge
из moreutils . sponge
будет «впитывать стандартный ввод и записывать в файл». Без аргументов этот файл является стандартным выводом. Данные, введенные для этой команды, сохраняются в памяти до EOF, а затем сразу записываются.
Для записи в обычный файл вы можете просто указать имя файла:
cmd | sponge filename
Основная цель sponge
- разрешить чтение и запись из одного и того же файла в конвейере, но он делает то, что вы тоже хочу.
Та же идея, что и в примере с 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
Запрашиваемое поведение, разве это не стандартное поведение простого кота?
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:$
Вы можете использовать следующие:
#!/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
Тривиальная замена одной -линейной губки -в Perl:
perl -e 'print <>'
(от @dave _thompson _085, в комментарии )
Perl также должен уметь работать с нулевыми байтами.