为什么这里的 echo 字符串参数省略了第一个单词?

为什么这里的 echo 字符串参数省略了第一个单词?

我正在尝试了解 here-docs 和 here-strings。我想了解为什么输出echo <<< more than one word省略了第一个单词。例如

> echo <<< more than one word
than one word
> echo <<< a b c
b c
>echo <<< "more than one word"
 -- <blank line> --

以下情况则不会发生相同的行为cat

>cat <<< "more than one word"
more than one word

我研究过

维基百科这里的文件文章。坦率地说,我发现许多维基百科文章深奥难懂,包括著名的文章;而且它们的例子并没有解决这个特定问题。

我的发行版

>cat /proc/version 
Linux version 3.11.10-301.fc20.x86_64 ([email protected]) (gcc version 4.8.2 20131017 (Red Hat 4.8.2-1) (GCC) ) #1 SMP Thu Dec 5 14:01:17 UTC 2013

我也没有在超级用户上找到关于这个特定主题的现有问题。

答案1

<<<将左侧命令传递stdin给右侧对应方。

这对于命令有意义cat,当没有给出文件名作为参数时,它会打印它。但这对于总是忽略它并只打印其参数的命令stdin没有意义。echostdin

答案2

我读了另一个答案几次,我还是不清楚,直到我意识到只能<<<看到a右侧并将其发送给命令stdin。这意味着

echo <<< a b c

相当于

echo b c <<< a

甚至

<<< a echo b c

即,即使b和在之后,它们也是c的参数(比较、、的等价性)。echo<<< acat -n < foo.txtcat < foo.txt -n< foo.txt cat -n

现在声明

echo[…] 总是忽略它stdin并只打印它的参数

满足了解释。

答案3

这里有一个好的答案

您在“<<<”后输入的字符串是文本分隔符。您使用了三个“<”,而不是两个,这可能会导致您注意到的有趣行为。如果您使用命令 cat 而不是 echo,行为将更符合您的预期。

基本上,单词“more”和“a”被用作标志来识别多行字符串何时结束。

相关内容