被接受的答案是正确的。head
不会为输入(甚至没有输入)返回非零值
但我发现了一些更多的奇怪之处
我找到了一种方法,可以正确地停止它。
seq 10 | while head -c 4 | ifne -n false; do : ; done;
遗憾的是,由于 head
的输出遍布在 while
的主体上,因此您无法对该构造做太多事情。
我发现的一个用途是在每 x 个字节(包括尾部)中插入一个字符。
/> printf '12345678910' | { while head -c 2 | ifne -n false; do printf 'a'; done; }
/> 12a34a56a78a91a0a
你应该使用
sed 's/.\{4\}/&a/g'
。
这里有一个稍微更有用的命令,它将接收两个字节的输入,"处理"它,然后将其放在某个地方:
printf '12345678910' | { while true; do head -c 2 < /dev/stdin | ifne -n false >> file.txt || break; done;
你应该使用
split --filter
。
还有一个非常奇怪的用例,当你尝试在 while 循环中使用 /dev/stdin
调用 head
时。
/> printf '12345678910' | { while head -c 2 | ifne -n false; do head -c 3 </dev/stdin | ifne -n false >> every3.txt || break; done > every2.txt; }
/> cat every2.txt
12670
/> cat every3.txt
345891
正如您所看到的,它每2个字节循环一次,然后每3个字节循环一次。
12 345 67 891 0
您应该使用bbe
。
您可以将其用作某种简陋的进度指示器。
/> printf '12345678910' | while head -c 2 | ifne -n false; do echo "2 bytes travelled" > /dev/stderr ; done > /dev/null;
2 bytes travelled
2 bytes travelled
2 bytes travelled
2 bytes travelled
2 bytes travelled
2 bytes travelled
你应该使用
pv
。
这个结构实际上可以做什么...
¯\_(ツ)_/¯
<<
重定向,这种效果就会消失。 - Joce NoToPutinsWarInUkrainehead -n 1
会做什么? - Charles Duffyhead -n 1 /dev/null
-- 它的退出状态是什么?当 while 循环的条件部分看到这个退出状态时,你希望它采取什么行动? - Charles Duffy