Eke*_* Mo 14 shell buffer stdout
除了使用临时文件来提供帮助之外,是否有一种方法/程序可以缓冲输入,stdin
但在获取EOF
. 我也不想使用 shell 变量(例如buffer=$(cat)
)。
该程序应如下所示(假设程序名称为buffered-cat
):
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
Run Code Online (Sandbox Code Playgroud)
现在程序收到了^D
,buffered-cat
输出内容
line 1
line 2
line 3
Run Code Online (Sandbox Code Playgroud)
Mic*_*mer 31
您可以使用sponge
from moreutils执行此操作。sponge
将“吸收标准输入并写入文件”。没有参数,该文件是标准输出。给这个命令的输入存储在内存中直到 EOF,然后一次全部写出。
要写入普通文件,您只需提供文件名:
cmd | sponge filename
Run Code Online (Sandbox Code Playgroud)
的主要目的sponge
是允许从管道内的同一个文件中读取和写入,但它也可以执行您想要的操作。
mur*_*uru 21
一个穷人的sponge
使用awk
:
awk '{a[NR] = $0} END {for (i = 1; i <= NR; i++) print a[i]}'
Run Code Online (Sandbox Code Playgroud)
如果你有tac
,你也可以滥用它:
... | tac | tac
Run Code Online (Sandbox Code Playgroud)
只要您的输入是 ASCII 文本(直到最后sed -z
不包含 NUL 0x0 字节),然后执行您想要的操作:
$ sed -z ''
Line 1
Line 2
Line 3
^D
Line 1
Line 2
Line 3
$
Run Code Online (Sandbox Code Playgroud)
的-z
原因sed
治疗NUL字节作为一个行定界符而不是通常的换行符。因此,只要您的输入是没有 NUL 字节的常规文本,那么 sed 就会继续将整个输入读入其模式缓冲区,直到达到 EOF。 sed
然后不对缓冲区进行处理并输出它。
如果输入中存在 NUL 字节,则可以改为执行以下操作:
sed ':l;N;bl'
Run Code Online (Sandbox Code Playgroud)