here 文档,又称作 heredoc、hereis、here-字串或 here-脚本,是一种在命令行 Shell 和程式语言里定义一个字串的方法。
它可以保存文字里面的换行或者是缩进等空白字符。一些语言允许在字串里执行变量替换和命令替换。
当编写 Shell 脚本时,你可能在某些情况下,你需要将文本或代码的传递给交互式命令,如 tee
,cat
或 sftp
。
在 Bash 和 Zsh 等其他 Shell 中,Heredoc 是一种重定向类型,它允许您将多行输入传递给命令。
[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
这是 HereDoc 的采用的语法形式。第一行开头的命令 COMMAND
是可选的,后跟标准输入重定向操作符 <<
和定界符 DELIMITER
。
您可以使用任何字符串作为定界符 DELIMITER
,最常用的是 EOF 或 END。
在出入重定向符号 <<
后面加上减号 -
将使所有前导制表符被忽略。这使您可以在Shell 程序脚本编写内容时使用缩进。不允许使用前导空格字符,只能使用制表符。
HERE-DOCUMENT
可以包含字符串,变量,命令和任何其他类型的输入。最后一行以定界标识符结尾。分隔符前面不允许有空格。
Heredoc 示例
在本节中,我们将介绍一些如何使用 Heredoc 的基本示例。Heredo c最常与 cat 命令组合使用。
在下面的示例中,我们传递了两行文本,其中包含一个环境变量和 whoami
命令来使用 Heredoc。
cat << EOF
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
The current working directory is: /home/myfreax
You are logged in as: myfreax
从输出中可以看到,变量和命令输出都被替换。让我们看看如果将定界符括在单引号或双引号中会发生什么。
您可能会注意到,当使用引号引起来时,Shell 不会进行任何参数展开和命令替换。
cat <<- "EOF"
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
如果在语句或循环中使用 Heredoc,请使用 <<-
允许您缩进代码。
if true; then
cat <<- EOF
Line with a leading tab.
EOF
fi
您也可以使用 >
,>>
标准输出重定向符号重定向到文件,而不是在屏幕上显示输出。
cat < file.txt
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
如果 file.txt 不存在,它将会创建。使用时 >
,文件将被覆盖,而 >>
会将输出追加到文件中。
Heredoc 输入也可以通过管道传递。在以下示例中,sed
命令用 l
字符替换所有字符 e
。
cat <<'EOF' | sed 's/l/e/g'
Hello
World
EOF
SSH 使用 heredoc
使用 Heredoc 是通过 SSH 在远程系统执行多个命令的最便捷的方法。您可能还需要设置基于 SSH 密钥无密码登录并连接到Linux服务器。
使用不带引号的定界符时,请确保转义所有变量,命令和特殊字符,否则它们将在本地被解释,进行命令,变量的替换操作。
ssh -T user@host.com << EOF
echo "The current local working directory is: $PWD"
echo "The current remote working directory is: \$PWD"
EOF
结论
在本教程中,您了解了什么是 heredoc
。以及如何在 Shell 程序脚本中使用它。如果您有任何问题或反馈,请随时发表评论。