让我举个例子吧:
$ timeout 1 yes "GNU" > file1
$ wc -l file1
11504640 file1
Run Code Online (Sandbox Code Playgroud)
$ for ((sec0=`date +%S`;sec<=$(($sec0+5));sec=`date +%S`)); do echo "GNU" >> file2; done
$ wc -l file2
1953 file2
Run Code Online (Sandbox Code Playgroud)
在这里您可以看到该命令在一秒钟内yes
写入11504640
行,而我只能1953
在 5 秒内使用 bashfor
和echo
.
正如评论中所建议的,有各种技巧可以提高效率,但没有一个能与以下速度相媲美yes
:
$ ( while :; do echo "GNU" >> file3; done) & pid=$! ; sleep 1 ; kill $pid
[1] 3054
$ wc -l file3
19596 file3
Run Code Online (Sandbox Code Playgroud)
$ timeout 1 bash -c 'while …
Run Code Online (Sandbox Code Playgroud) yes
在 unix/linux 中有一个命令,它基本上无限地打印y
到stdout
. 它有什么意义,它有什么用?
“是的,而且……”是即兴喜剧中的一个很棒的经验法则。在 UNIX 世界中则不然。
当我运行这个公认的愚蠢yes&
命令时,我无法中断它。终端崩溃或陷入循环。
我希望该yes
进程立即暂停,因为如果尝试写入标准输出,后台的任何进程都应该暂停,但情况似乎并非如此,我想知道为什么。
假设我有一个名为 的makefile,hour_long_recipe
顾名思义,它需要一个小时才能运行。在整个食谱的随机点上,它会问是/否问题。假设它总共问了 10 个问题。
一种可能(并且经常被推荐)的运行方式是:
yes | make hour_long_recipe
Run Code Online (Sandbox Code Playgroud)
用 回答所有问题y
。但是,根据我的理解,无论是否实际使用来自其标准输入的数据,都会yes
以高达每秒 10.2 GiB 的速度输出到标准输出make
。
即使它只有 10 MiB/s(比任何yes
可以相信的 reddit 线程的实现都慢得多),在一小时内它会加起来超过 35 GiB,其中只有 20 个字节将被读取。数据去哪儿了?可以将其保存到磁盘,但这很浪费,如果磁盘填满的速度足够快,它甚至可能导致make
失败。
据推测,操作系统会阻止它到达那个状态,但是如何呢?什么是限制,达到该限制时会发生什么?
调用时如何通过管道将 aY
或yes
传递到程序sudo
?
我们可以这样输入
yes | command
yes | yum update
Run Code Online (Sandbox Code Playgroud)
如何通过如下方式将y
from管道yes
传输到程序中sudo
?
yes| sudo command
Run Code Online (Sandbox Code Playgroud)
在y
从yes
IS传递到command
,应该进入sudo
,并sudo
应索要密码正常。我怎样才能做到这一点?
我正在尝试编写一个非交互式系统更新脚本。
题:
如果以下工作正常:
yes | dpkg --configure -a
Run Code Online (Sandbox Code Playgroud)
以下工作也会很好吗?:
yes | apt-get install --fix-broken
Run Code Online (Sandbox Code Playgroud) 场景:我正在运行一堆命令,其中一些命令提示输入“是/否”答案。我不小心键入了yes
命令,而不是对提示的响应。哎呀。现在我的外壳看起来像这样:
$ yum install -y something-important
... useful output I want to go back and refer to, perhaps multiple times
$ yes
y
y
y
y
y
y
y
y
y
y
y
... there are tens of thousands of lines... oh god, Y??
Run Code Online (Sandbox Code Playgroud)
在意识到发生了什么后,我成功地停止了yes
命令,但损害已经造成了。我当时正处于紧张的 shell 会话中,现在我失去了向上滚动以获得相关输出的能力!显然以前的文本仍然存在,但它基本上无法访问,因为它与所有y
. 类似的东西clear
将有助于y
从我的屏幕上删除难看的种子,但它不会帮助我回到之前的会话状态。
如何挽救本次会话之前的输出以使其仍然有用?