我有一个调用两个命令的脚本:
long_running_command | print_progress
Run Code Online (Sandbox Code Playgroud)
在long_running_command
打印的进展,但我很不满意它。我正在使用print_progress
使其更好(即,我在一行中打印进度)。
问题:将管道连接到标准输出也会激活一个 4K 缓冲区,所以漂亮的打印程序什么都没有……什么都没有……什么都没有……很多……:)
如何禁用4K
缓冲区long_running_command
(不,我没有源)?
我需要用 mkfifo 创建一个命名管道。例如:
mkfifo mypipe
Run Code Online (Sandbox Code Playgroud)
我将有一个从管道读取的 systemd 服务(一个简单的 shell 脚本),并且我将在同一管道上编写调用另一个脚本(例如write-to-pipe.sh
)。
write-to-pipe.sh
如果我在管道上同时有多个写入实例怎么办?我的意思是,许多用户可以执行write-to-pipe.sh
. 如果两个用户尝试同时在管道上写入,是否会造成麻烦(就像两个用户尝试在常规文件(而不是管道)上写入并且其中一个用户覆盖另一个用户时)?
我希望这不是重复的,但我找不到这个问题的答案......
谢谢
如果我使用:
strace echo 'a
b
c' > file
Run Code Online (Sandbox Code Playgroud)
底线是:
write(1, "a\nb\nc\nd\n", 8) = 8
Run Code Online (Sandbox Code Playgroud)
但在
strace echo 'a
b
c
d' > /dev/pts/0
Run Code Online (Sandbox Code Playgroud)
这些线路是:
write(1, "a\n", 2) = 2
write(1, "b\n", 2) = 2
write(1, "c\n", 2) = 2
write(1, "d\n", 2) = 2
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,为什么它是逐行写的,而在第一种情况下它是一起写的。可能是因为终端是字符设备,但我得到了字符设备的定义:
字符 (char) 设备是一种可以作为字节流(如文件)访问的设备。 char 设备和常规文件之间唯一相关的区别是您始终可以在常规文件中来回移动,而大多数字符设备只是数据通道,只能按顺序访问。
编辑:Shell 是 bash。