bash:“<”之间的区别和“<<<<重定向

时间:2018-01-12 23:10:23

标签: bash

bash中的这段代码读取和处理变量中的行

while read -r line; do
    echo "... $line ..."
done <<< "$list"

如果我替换&lt;&lt;&lt;与&lt;,它不起作用。不知道为什么会这样

4 个答案:

答案 0 :(得分:0)

来自Bash手册页:

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

              <<<word

       The word undergoes brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, and quote removal.  Pathname expansion and word
       splitting are not performed.  The result is supplied as a single string to the command on its standard input.

您可以通过查阅参考手册找到这样的答案,这些手册在linux中可以通过man命令轻松访问。

答案 1 :(得分:0)

查看 this page

  

重定向输入

N < SOURCE
     

输入描述符N使用SOURCE作为其数据源。如果N是   省略,假定filedescriptor 0(stdin)。

<<TAG
...
TAG
     

here-document是使用指定的源数据的输入重定向   直接在命令行(或在脚本中),没有&#34;外部&#34;资源。   重定向运算符&lt;&lt;与标签TAG一起使用   用于标记以后输入的结束:

# display help

cat <<EOF
Sorry...
No help available yet for $PROGRAM.
Hehe...
EOF

<<< WORD 
     

here-strings是here-documents的变体。 WORD这个词   用于输入重定向:

cat <<< "Hello world... $NAME is here..."
     

如果它包含空格,请注意引用WORD。否则   休息将作为正常参数给出。

     

here-string会在数据上添加换行符(\ n)。

答案 2 :(得分:0)

<用于从文件重定向。因此< "$list"查找名称为list变量值的文件,并尝试从该文件中读取。

<<<创建一个here-string,<<< "$list"直接从变量的值中读取。

答案 3 :(得分:0)

两者都是重定向的形式。有三种标准I / O流:标准输入(stdin),标准输出(stdout)和标准错误(stderr)。默认情况下,所有指针都指向当前终端,但所有指针都可以重定向到其他位置。

stdin命令使用read时,输入默认来自键盘,但可以来自文件(请记住“一切都是文件”)。

<的情况下,输入来自用户指定的文件(忽略进程替换的额外复杂性)。

但是有两种结构可以让我们在脚本中指定数据,这些是<<(一个 heredoc )和<<<(一个这里 - 串)。这两个“神奇地”将脚本中的数据重定向到命令的stdin

魔术不是特别有效。在幕后发生的事情是创建一个临时文件,将数据写入其中,然后将该文件用于输入。

所以,区别在于:

<用户提供文件

<<< shell根据提供的数据为您创建文件

(参考:bash源代码redir.c,特别是函数write_here_string()