我有一个调用两个命令的脚本:
long_running_command | print_progress
Run Code Online (Sandbox Code Playgroud)
在long_running_command打印的进展,但我很不满意它。我正在使用print_progress使其更好(即,我在一行中打印进度)。
问题:将管道连接到标准输出也会激活一个 4K 缓冲区,所以漂亮的打印程序什么都没有……什么都没有……什么都没有……很多……:)
如何禁用4K缓冲区long_running_command(不,我没有源)?
作为评论,我很困惑为什么 makefile 中的“| true”与“|| true”用户cjm写道具有相同的效果:
另一个要避免的原因
| true是,如果命令产生足够的输出来填满管道缓冲区,它将阻塞等待 true 读取它。
我们是否有办法找出管道缓冲区的大小?
我的粘贴缓冲区中有一些文本,例如我做了一个yw(猛拉单词),现在我的缓冲区中有 'foo'。
我现在转到“bar”这个词,我想用我的粘贴缓冲区替换它。
要手动替换文本,我可以这样做cw,然后输入新单词。
如何进行“更改单词”,但使用粘贴缓冲区的内容而不是手动输入替换单词?
我现在最好的选择是到要替换的单词的开头并执行dw(删除单词),然后转到另一个位置,然后执行yw(猛拉单词)。然后回到替换区域并做p(粘贴)这有点笨拙,特别是如果它们不在同一个屏幕上。
有没有办法告诉 Linux 内核只将一定比例的内存用于缓冲区缓存?我知道/proc/sys/vm/drop_caches可以用来临时清除缓存,但是否有任何永久设置可以防止它增长到超过主内存的 50%?
我想这样做的原因是,我有一台运行 Ceph OSD 的服务器,它不断地从磁盘提供数据,并设法在几个小时内用完整个物理内存作为缓冲区缓存。同时,我需要运行将分配大量(数十 GB)物理内存的应用程序。与流行的看法相反(请参阅关于几乎所有有关缓冲区缓存的问题的建议),通过丢弃干净的缓存条目来自动释放内存不是即时的:当缓冲区缓存已满时,启动我的应用程序可能需要长达一分钟的时间( *),而在清除缓存后(使用echo 3 > /proc/sys/vm/drop_caches),相同的应用程序几乎立即启动。
(*) 根据 Vtune 在一个名为pageblock_pfn_to_page. 这个功能似乎与查找大页面所需的内存压缩有关,这让我相信实际上是碎片化的问题。
是否可以在 vim 中更改缓冲区的名称?
具体来说,我使用Conque Shell在 vim 中打开 shell(每个 shell 都在一个缓冲区中)并且有多个 shell,我看到:
10: bash - 1
11: bash - 2
Run Code Online (Sandbox Code Playgroud)
在我的缓冲区列表中。我想用更有意义的名称重命名这些缓冲区(例如,“mercurial”而不是“bash - 2”)。是否可以?
当我第一次接触 Linux 时,2000 年在 Cisco Systems 工作,我被教导了该sync命令的优点,用于将缓冲区刷新到磁盘以防止文件系统损坏/数据丢失。不仅那里的同事告诉我,大学里的朋友也告诉我总是跑sync“几次”或“一堆”,也就是说,也许 5-10 次,而不是一次。
从那以后我一直保持这个习惯,但是,这有什么好处吗?有没有其他人听说过这个?最重要的是,任何人都可以为/反对您需要sync多次运行才能有效的想法提供良好的基本原理/经验证据吗?
什么是“回滚”,并在节目像“滚动缓冲区”bash和screen,以及它们如何涉及到TTY,正在运行的程序,标准输入/输出/标准错误?
这是迄今为止我发现的“回滚”的唯一定义(在archlinux wiki 中):
回滚是在文本控制台中实现的一项功能,它允许用户返回查看已滚出屏幕的文本行。这是通过在视频适配器和显示设备之间为此目的创建的缓冲区实现的;回滚缓冲区。
但是,这给我带来了更多的问题:
vim中screen启动的bash启动中ssh启动,这些程序中的哪些正在控制回滚缓冲区?我也用screen,以转储回溯到一个文件中。这个文件的顶部有很多空白,我的终端模拟器显示的“视图”似乎只是缓冲区底部的几行。
vim可以“清除”我的整个终端窗口,因为它可以临时访问父 shell 的回滚缓冲区?vim使用它自己的回滚缓冲区,该缓冲区以某种方式覆盖在父回滚缓冲区之上?我不明白管道中的数据是如何流动的,希望有人能澄清那里发生了什么。
我认为命令管道以逐行方式处理文件(文本、字符串数组)。(如果每个命令本身逐行工作。)每行文本都通过管道,命令不会等待前一个完成处理整个输入。
但似乎并非如此。
这是一个测试示例。有几行文字。我将它们大写并重复每行两次。我这样做cat text | tr '[:lower:]' '[:upper:]' | sed 'p'。
为了遵循这个过程,我们可以“交互地”运行它——跳过cat. 管道的每个部分逐行运行:
$ cat | tr '[:lower:]' '[:upper:]'
alkjsd
ALKJSD
sdkj
SDKJ
$ cat | sed 'p'
line1
line1
line1
line 2
line 2
line 2
Run Code Online (Sandbox Code Playgroud)
但是完整的管道确实等待我完成输入,EOF然后才打印结果:
$ cat | tr '[:lower:]' '[:upper:]' | sed 'p'
I am writing...
keep writing...
now ctrl-D
I AM WRITING...
I AM WRITING...
KEEP WRITING...
KEEP WRITING...
NOW CTRL-D
NOW CTRL-D
Run Code Online (Sandbox Code Playgroud)
应该是这样吗?为什么不是一行一行的?
我使用 emacs 进行日常 javascript 编辑,在缓冲区之间切换我使用 Cx LEFT 和 Cx RIGHT 并且我对此很好(即使我发现很难知道我正在修改的文件的路径)。
我的问题:
在我总是拥有*scratch*并*Messages*打开的启动时,我认为放入(kill-buffer "*scratch*")我的 .emacs 可以解决问题,但事实并非如此,您有什么建议吗?
当我打开文件时,我总是做 TAB 自动完成,所以每次我创建一个*Messages*包含完成选项的新缓冲区时,我如何防止它创建,或者更好的是,我如何让 emacs 杀死它,在我完成之后做出我的选择?
如果您认为我正在做的事情与我在顶部所说的导航不“应该的方式”,请说出您的意见。
有没有办法只同步一个分区而不是所有分区?
类似于“同步/dev/sdc1”。
buffer ×10
pipe ×3
shell ×3
vim ×2
block-device ×1
cache ×1
emacs ×1
filesystems ×1
linux-kernel ×1
replace ×1
scrolling ×1
stdout ×1
terminal ×1
tty ×1
vi ×1