管道与变量赋值有何不同?
我认识你不能使用空字节。还有哪些其他例子?
对于像下面这样的管道怎么样yes | cat
?我注意到它y
在分配时输出
test=`yes`
不输出任何内容。在cat
执行过程中,整个命令是否在传送数据之前执行?
答案1
test=`yes`
将尝试读取 的完整输出yes
并将其分配给变量test
。
由于 的输出yes
是无限的,因此该赋值将调用无限循环。
在幕后,它使用pipe
操作系统机制,就像|
操作一样。
test=`yes`
有点像
yes | thisShell.slurpInputAndSaveToVariable test
cat
不会尝试吸收其整个输入,这使得它可以作为流生产者(在本例中是无限的)和消费者对同时运行yes
。cat
答案2
管道
yes
是一个重复输出字符串(默认为“y”)直到被杀死的命令。看man yes
cat
是一个命令,它将在 STDIN 上接收到的所有内容或作为参数列出的所有文件的串联输出到 STDOUT。看man cat
管道 ( |
) 将上一个命令的 STDOUT 重定向到下一个命令的 STDIN。
因此,管道传输cat
是浪费 CPU 周期。
变量赋值
变量赋值允许您在内存中临时存储字符串。
例子:
$ test="this is a string!"
$ echo $test
this is a string!
如果要将命令的结果存储在变量中,则需要使用子 shell。
例子:
$ echo "file contents :)" > test.file
$ test="$(cat test.file)"
$ echo $test
file contents :)
参考
bash的详细使用请参见https://www.gnu.org/software/bash/manual/bash.html
答案3
管道正如其名称所暗示的那样:它们提供了一种将数据从一个管道成员流式传输到下一个管道成员的方法。处理无限大小的流是可能的。处理无限流有意义的情况包括不时打印迄今为止所见内容的进度或统计信息,以及用户可以随时终止管道的情况。
另一方面,shell 替换构造(反引号或
$()
)直到括起来的语句终止时才会完成。由于示例中的语句yes
不会终止,因此 也不会终止$(yes)
。
我想说这是分配和管道极大不同的一种方式;人们无法真正将无限长度的值分配给变量,但管道 1 很好并且可以工作。