当我写一个命令时
$ 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”,因为这是我的日期命令给我的结果......