<<<是什么意思?这是一个示例:

$ sed 's/a/b/g' <<< "aaa"
bbb


是否可以在更多Linux命令上使用通用功能?

看起来像是通过sed程序来提供字符串aaa,但是通常不使用<<或<吗?

评论

似乎<用于传递文件(或目录),<<用于传递多行(类似于cisco开关中的banner命令;在这种情况下以自定义字符串@终止),<< <<用于传递字符串(而不是文件)。用猫自己测试它们,您会很快掌握它。

#1 楼

其他人已经回答了一个基本问题:这是什么?
让我们看看它为什么有用。

您还可以像这样将字符串输入到命令的stdin中:

echo "$string" | command


然而,在bash中,引入管道意味着单个命令在子shell中运行。请考虑以下问题:

echo "hello world" | read first second
echo $second $first


第二个echo命令的输出仅打印一个空格。哇啊?我的变量出了什么事?因为read命令在管道中,所以它在子shell中运行。它从其stdin正确读取2个单词并分配给变量。但是随后命令完成,子shell退出并且变量丢失。

有时,您可以使用花括号来解决此问题:

echo "hello world" | {
    read first second
    echo $second $first
}


如果您需要包含值,则可以,但是您仍然不需要在脚本的当前shell中不要包含这些变量。
要纠正这种混乱的情况,请使用here字符串

read first second <<< "hello world"
echo $second $first


啊,好多了! br />

评论


除了这里的字符串以外,出于相同的原因,进程替换非常有用。

–格伦·杰克曼
2013年6月22日18:32

这是<<<以及管道和子壳的绝佳解释!我从中学到了两者。

–大卫·曼(David Mann)
17年5月12日在1:29

请注意,使用简单的echo ... | read示例,如果您(1)启用“ lastpipe” shell选项(shopt -s lastpipe)和(2)禁用作业,则管道可以工作以在当前shell中设置变量控制(设置+ m)

–格伦·杰克曼
17年8月9日在20:00



很有意思。您给出的情况不会导致使用zsh出现意外行为。

–瑞安·沃德(Ryan Ward)
19年5月8日21:00



在我的zsh上,echo $ second $ first的输出是world hello

–Âaafulei
19年7月25日在4:28

#2 楼

<<<表示此处的字符串。

$ cat <<< 'hi there'
hi there


它将右侧的单词传递到左侧命令的标准输入。


<<表示此处文档。

$ cat <<EOF
> hi
> there
> EOF
hi
there


EOF可以是任何单词。整个文件或显示长消息。

cat > some-file <<FILE
foo
bar
bar bar
foo foo
FILE



<将文件内容传递到命令的标准输入。

$ cat < /etc/fstab
/dev/sda2               /boot   ext4            nosuid,noexec,nodev,rw,noatime,nodiratime       0 2
/dev/sda4               /       ext4            rw,noatime,nodiratime,  0 1
/dev/sdb5               /var    ext4            nosuid,noexec,nodev,rw,relatime 0 2
 ...


评论


为什么有人想要cat
– Griddo
18年7月31日在7:06

在第一种情况下,cat打开文件,在第二种情况下,shell打开文件,将其作为cat的标准输入传递。来自unix.stackexchange.com/questions/258931/…的报价

–星
19年4月19日,0:53



我不知道为什么cat
– Brian C
19年7月9日在3:43



#3 楼

看看Bash手册页。该表示法是所谓的here文档和here字符串的一部分。它使您能够生成作为一个连续字符串的多行数据输入。您要询问的变体称为此处字符串。

Bash手册页摘录

Here Strings
   A variant of here documents, the format is:

          <<<word

   The word is expanded and supplied to the command on its standard input.


#4 楼

它的意思是字符串。

<<< strings


字符串被扩展并通过标准输入提供给命令。在您的示例中,字符串aaa被馈送给sed命令通过stdin。