- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一些编码实验(在尝试找到编码问题的较短答案时进行的)导致了一些有趣的惊喜:
seq 2 | while head -n 1 ; do : ; done
输出(点击 Control-C 否则它将永远浪费 CPU 周期):
1
^C
相同,但使用重定向输入文件而不是管道输入:
seq 2 > two
while head -n 1 ; do : ; done < two
输出(点击 Control-C):
1
2
^C
问题:
为什么 while
循环不停止 seq 2 | head -n 1
会吗?
为什么重定向输入比管道输入产生更多输出?
/li>以上代码在最近的 Lubuntu 上用 dash
和 bash
进行了测试。 seq
和 head
都来自 coreutils(版本 8.25-2ubuntu2)包。
绕过必须按 (Ctrl-C) 的方法:
timeout .1 sh -c "seq 2 > two ; while head -n 1 ; do : ; done < two"
1
2
timeout .1 sh -c "seq 2 | while head -n 1 ; do : ; done"
1
最佳答案
head -n 1
,当在 stdin 上给定一个空流时,完全符合其权利和规范,可以立即以成功退出状态退出。
因此:
seq 2 | while head -n 1 ; do : ; done
...可以合法地永远循环,因为 head -n 1
不需要以非零状态退出并因此终止循环。 (只有在“发生错误”时,标准才需要非零退出状态,并且文件行数少于输出请求的行数不被定义为错误)。
确实,这是明确的:
When a file contains less than number lines, it shall be copied to standard output in its entirety. This shall not be an error.
现在,如果您的 head
实现在第一次调用后(打印第一行的内容),使文件指针在第二行当它退出时(绝对不需要这样做),然后第二个循环实例将读取第二行并发出它。然而,这又是一个实现细节,它取决于编写您的 head
实现的人是否选择任一个:
实现者完全有权根据仅在运行时可用的标准来决定要遵循哪些实现。
现在,假设您的头
总是尝试一次读取 8kb block 。那么,它怎么能让指针在第二行排队呢? [* - 除了向后查找,some implementations do当给定文件时,但标准不需要;感谢 Rob Mayhoff 在这里指点]
如果 seq
的并发调用在第一个 read
发生时仅写入并刷新了一行,则可能会发生这种情况。
显然,这是一种对时间非常敏感的情况——竞争条件——并且还取决于未指定的实现细节,(seq
是否在行之间刷新其输出——这作为 seq
未指定为 POSIX 或任何其他标准的一部分,在平台之间完全不同。
关于bash - 'while head -n 1' 好奇心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37861360/
当我调用这个 promise 时,输出与函数调用的顺序不匹配。 .then出现在 .catch 之前, 即使 promise 与 .then之后被调用。这是什么原因? const verifier =
在 MIPS 程序集中清除寄存器 (=0) 的最快方法是什么? 一些例子: xor $t0, $t0, $t0 and $t0, $t0, $0 move $t0, $0 li
欧拉计划 - 3 --- 问题 我是编程艺术的初学者,我开始解决 Project Euler 问题。 我尝试用 C 语言解决第三个问题,但我不明白为什么它不起作用。 #include
我有一个相当简单但庞大的系统设置。它将数据存储在 void* 数组中,因为它存储的数据可能在 float 或 double 之间变化,具体取决于需要多少精度。 只是执行 delete [] data
谁能解释一下 mysqli multi_query() 的用途是什么?我不明白一个简单的 MySQLi 查询是否支持多语句,或者我是否被迫使用 multi_query() 来执行这样的查询: S
我有两个问题。其中一个对我有意义,另一个对我没有意义。第一个: SELECT gender AS 'Gender', count(*) AS '#' FROM registrations
我的一位同事正在使用内置的 max函数(在 Python 2.7 上),他发现了一个奇怪的行为。 错误地,他没有使用关键字参数 key(如 key=lambda n: n)对作为参数传递的列表进行预排
我有两个问题。其中一个对我有意义,另一个对我没有意义。第一个: SELECT gender AS 'Gender', count(*) AS '#' FROM registrations
我是 python 新手,正在为我的工作职能学习它。我正在遵循一个非常基本的初学者教程,其中大部分看起来非常熟悉并且与我使用的其他语言相似。但是......当我做非常简单的事情时 print('hel
一些编码实验(在尝试找到编码问题的较短答案时进行的)导致了一些有趣的惊喜: seq 2 | while head -n 1 ; do : ; done 输出(点击 Control-C 否则它将永远浪费
我目前正在进行一些最后的优化,主要是为了娱乐和学习,并发现了一些给我留下几个问题的东西。 首先是问题: 当我通过使用 DynamicMethod 在内存中构建方法时,并使用调试器,在反汇编 View
我想知道为什么分别相当于乘法和除法的移位运算符(>)的优先级低于加法运算符,例如“+”。 换句话说: int a = 1 + 2 * 8; //yields 17 鉴于: int a = 1 + 2
我一直在研究一些 .NET 功能(即管道、内存和数组池)以实现高速文件读取/解析。在使用 Array.Copy、Buffer.BlockCopy 和 ReadOnlySequence.CopyTo 时
这个问题更多是出于好奇而不是真正的问题。考虑以下代码(C# 4.0,如果重要的话): class Program { static Point myPoint = new Point(3, 5);
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: how to sum a large number of float number? 我有一个矩阵“x”,它
有人可以解释为什么这些在 Python 2.7.4 中输出不同的东西吗?他们在 python 3.3.1 中输出相同的东西。我只是想知道这是否是 2.7 中已在 3 中修复的错误,或者是否由于语言的某
我是一名优秀的程序员,十分优秀!