【问题标题】:make stdin unbufferd for long lines in console ... cat > textfile在控制台中为长行设置标准输入无缓冲 ... cat > text file
【发布时间】:2021-06-23 12:37:03
【问题描述】:

也许是一个奇怪的问题,但是

在 ubuntu linux 上将 cat 粘贴到文本文件(cat > textfile 并在完成时按 Ctrl+D 发出 EOF 信号)时,我遇到了一个奇怪的结果。 事实证明,stdin 行缓冲区可以防止行超过 4k(请参阅Line Buffered Cat

gnu cat(与posix cat)的选项和stdbufstdbuf -i0 -o0 cat > textfile)的使用都不会导致文件超过4k。

显然我做错了什么,因为cat 在使用 nano 或 vim 创建时会标准输出这类文件。

我真的很想继续使用这种方便的方式来动态创建文件或从 cli 管道输入其他命令而不受此限制。

谢谢

版本:cat (GNU coreutils) 8.28

编辑:它显然不是 cat 本身,而是标准输入在终端中缓冲的方式,但是 vim 和 nano 设法将其切换 (另见Disable buffering for stdin and stdout using setvbuf()

【问题讨论】:

  • 我怀疑这个限制与 cat 无关,而是终端缓冲区的问题。
  • 我也怀疑这个,所以我用 nano 和 vim 尝试了这个,它们都有相同的终端界面
  • vim 不使用终端缓冲区。它将终端置于原始模式。我怀疑 nano 也是如此。
  • 所以解决方案是以某种方式禁用终端缓冲区... sigh 我试过了
  • 这可能是了解您正在使用哪个剪贴板实现的起点:unix.stackexchange.com/questions/254740/…

标签: linux command-line-interface posix stdin cat


【解决方案1】:

没有可以剪辑线条的缓冲区。

例子:

$ { for i in {1..4096}; do printf x; done; echo y; } | cat > data

该文件包含 4098 个字节:4096 个 x、一个 y 和一个换行符。

$ stat -c %s data
4098

而且它只有一行。

$ wc -l data
1 data

【讨论】:

  • 什么告诉你每次打印后没有刷新?
  • 但是好主意我已经稍微修改了你的脚本以验证 cat 不使用缓冲区的正确假设(正如我在使用它并遇到这个陷阱时所假设的那样)z=""; for i in {1..4096}; do z="${z}x"; done; echo "${z}yz" | cat > /tmp/thisshouldwork.txt ; wc /tmp/thisshouldwork.txt
  • @Summer-Sky 这样的管道“冲洗”不存在。它存在 fsync 但如果仅适用于文件而不适用于管道。并且管道缓冲区大于 4k:unix.stackexchange.com/questions/11946/…
  • @Summer-Sky:在您的情况下,cat 有一个 tty 用于输入,在这个答案中它是一个 pipe。看到不同的缓冲行为并不奇怪。
  • @ceving:您的测试无效,您需要通过伪 tty 传递数据才能在 OP 的相同场景中测试 cat
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2017-06-06
  • 1970-01-01
  • 2012-07-05
  • 2014-12-07
相关资源
最近更新 更多