在 UNIX 中以管道方式执行的命令

在 UNIX 中以管道方式执行的命令

当我写一个命令时

$ echo date  

然后它会按原样打印“date”,即它不运行 date 程序。
但是当我写

$ echo date | wc  

然后就会产生正确的答案,就像运行日期一样。管道在这里是如何产生差异的?
请解释一下。

答案1

$ echo 日期|wc
      1 1 5

由于字节计数器 == 5 (= sizeof("date")),看来日期没有运行

$ echo 日期 | xargs 时间

运行日期作为命令

答案2

但事实并非如此。

尝试:

echo date | cat > here.out

然后尝试:

echo `date` | cat > here.out

答案3

问题是“echo”将以下文本发送到标准输出。在这种情况下,文本是“date”,因此您显示的内容将不起作用。这将:echo|date,因为 date 现在会生成 echo 的文本。

答案4

这与 bash 如何使用字符串有关。

如果你看看这些变量中存储了什么

d1=date
d2="date"
d3='date'
d4=`date`

您会注意到 d1、d2 和 d3 只是包含“日期”的字符串,而 d4 却具有执行命令日期的结果。

如果我们再进一步看看是否能发现这些字符串之间的区别。

d4=`date +%Y%m%d`
echo $d4

这意味着我们现在在 $d4 中存储了“20100418”。

d3='$d4'
echo $d3

现在在 $d3 中我们打印了字符串“$d4”,即这 3 个字符......

d2="$d4"
echo $d2

现在我们确实在 $d2 中存储了“20100418”,因为我们打印了 $d4 并将该输出保存到变量 $d2 中。

d1=$d4
echo $d1

然后将变量 $d4 的内容复制到变量 $d1 中。

希望这可以稍微解释一下这些字符串是如何工作的。

现在回到你的问题。

cj@zap:~$ echo date | wc
      1       1       5
cj@zap:~$ echo `date` | wc
      1       6      31
cj@zap:~$ date | wc
      1       6      31

那么这到底是什么意思呢? man wc 给出了这样的解释:

名称 wc - 打印每个文件的换行符、字数和字节数

因此“1 1 5”只是告诉我们有 1 个换行符、1 个单词和 5 个字符,并且与 date\n 匹配。

而“1 6 31”将匹配“sön 18 apr 2010 10.07.25 CEST\n”,因为这是我的日期命令给我的结果......

相关内容