「stdbuf(1)」-

使用修改的I/O流缓冲运行命令

命令语法格式

stdbuf OPTION… COMMAND

命令描述

命令stdbuf允许用户修改与程序关联的三个标准I/O流的缓冲操作。

命令参数COMMAND必须以程序的名称开头,该程序:

  • 使用ISO C FILE流进行输入/输出(注意,程序dd和cat不这样做)
  • 不调整其标准流的缓冲(注意程序tee不属于此类别)。

任何其他args将作为命令COMMAND的附加参数传递。

命令支持的选项及参数

必须提供给长选项的参数也必须提供给对应的短选项。

-i mode, –input=mode
调整标准输入流的缓冲。

-o mode, –output=mode
调整标准输出流的缓冲。

-e mode, –error=mode
调整错误流的缓冲。

–help
显示帮助信息并退出。

–version
显示版本信息并退出。

关于参数mode的取值

参数mode可以指定如下所属的值:

“L”
将流设置为行缓冲模式。在此模式下,数据被合并,直到输出换行符或从连接到终端设备的任何流中读取输入。使用标准输入时,此选项无效。

“0”

    禁用所选流的缓冲。在此模式下,立即输出数据,仅从输入中读取所请求的数据量。注意,输入和输出的功能差异。禁用输入缓冲不会影响流输入函数的响应性或阻塞行为。例如,即使底层的read返回的数据少于请求的数据,fread仍会阻塞,直到EOF或错误。

”size“

    指定要在完全缓冲模式下使用的缓冲区大小。size可以是一个整数,或者可选地后跟以下单位:

‘KB’ => 1000 (KiloBytes)

‘K’ => 1024 (KibiBytes)

‘MB’ => 1000*1000 (MegaBytes)

‘M’ => 1024*1024 (MebiBytes)

‘GB’ => 1000*1000*1000 (GigaBytes)

‘G’ => 1024*1024*1024 (GibiBytes)

以此类推,还有‘T’, ‘P’, ‘E’, ‘Z’, ‘Y’。

注意事项

在GLIBC平台中,指定缓冲大小,比如使用全缓冲模式,会导致未定义操作。

命令stdbuf仅安装在使用可执行和可链接格式(ELF)并支持constructor属性的平台上,因此可移植脚本不应依赖于它的存在。

退出状态

125 如果stdbuf本身失败

126 如果找到命令COMMAND但无法调用

127 如果命令COMMAND无法找到

其他的状态值为命令COMMAND的退出状态

使用示例

下面命令会快速的打印出access.log中的唯一列:

# tail -f access.log | stdbuf -oL cut -d ‘ ‘ -f1 | uniq

上面的命令中之所以需要使用stdbuf是由于存在于标准输出中缓冲问题。由于tail的输出是断断续续的,所以流向cut命令的数据可能不是完整的一行,当你使用cut取第一列的时候,可能并是你所期望的。因此我们这里用到了stdbuf -oL以行为单位进行缓冲。如果你看不懂我们在说什么,那你应该先读一下「标准流中的缓冲」一文。

相关手册

查看在线手册:http://www.gnu.org/software/coreutils/stdbuf

查看info手册:info ‘(coreutils) stdbuf invocation’

参考文献

更新日志

  • 07/05/2018 创建文章