Linux 中的输入重定向符号:<、<< 和 <<< 的解释与用法
在Linux中,<、<< 和 <<< 是三种不同的输入重定向符号,它们分别有不同的用途
<
(单小于号)
这是最基础的输入重定向符号,用于将文件内容作为命令的标准输入。例如:
command < input_file
在这个例子中,command
命令会从 input_file
中读取数据,而不是从键盘接收输入。
<<
(双小于号,后跟分界符)
这种形式被称为“Here Documents”,它允许你直接在命令行或脚本中定义一大段文本,然后将其作为命令的标准输入。分界符可以是任意不包含空格的字符串,通常是一个单词或者一对引号。以下是一个示例:
command << "EOF"
Here is some text to be passed as input.
It can span multiple lines.
EOF
# 编译一个docker镜像,不写Dockerfile文件,直接从重定向流获取
docker build -t example.com/iximiuz/test:latest - << EOF
FROM busybox:latest
CMD echo just a test
EOF
# 输入的多行信息,保存到default.conf
cat << EOF > default.conf
key=value
EOF
# 另外一种写法,输入的多行信息,保存到default.conf
cat << EOF | tee default.conf
character=utf8
EOF
当shell执行到 << "EOF"
时,它会开始读取下一行直到遇到指定的结束标记(这里是 “EOF”),并将这些内容作为一个整体传递给 command
。
注意事项
<< 后面跟的分隔符加双引号和不加双引号的区别在于是否允许内部的shell扩展:
- 不加双引号
command << delimiter
unquoted content here
$variable_expansion
$(command_substitution)
delimiter
在这种情况下,Here Document 内部的内容会经过 shell 解析,这意味着变量扩展 ( v a r i a b l e e x p a n s i o n ) 、命令替换 ( variable_expansion)、命令替换 ( variableexpansion)、命令替换((command_substitution)) 等会被执行。
- 加双引号:
command << "delimiter"
quoted content here
$variable_expansion
$(command_substitution)
delimiter
当分隔符用双引号包围时,Here Document 内部的内容将被视为字面值,即除了换行符之外,所有的内容都将被原样传递给命令,包括 $variable_expansion 和 $(command_substitution),它们不会被 shell 解释执行。
<<<
(三小于号)
这是所谓的“Here Strings”机制,在Bash和其他一些Shell中可用。它用来将一个字符串直接传送给命令作为标准输入,而不需要创建临时文件。
command <<< "This string becomes stdin"
在这里,command
将接收到字符串 “This string becomes stdin” 作为其输入,而不必从文件或其他I/O流中读取。
总结
总结起来,这三个符号都是为了改变命令默认的输入来源,但它们各自以不同方式提供了灵活性和便利性,适应不同的输入重定向场景。欢迎关注我的公众号鲁班曰