Unix << 符号的使用

常见的场景

$ cat <<EOF
> aaa
> bbb
EOF
aaa
bbb

这种用法称为 Here 文档

here文档[1],又称作heredoc、hereis、here-字符串或here-脚本,是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。它可以保存文字里面的换行或是缩进等空白字元。一些语言允许在字符串里执行变量替换和命令替换。

here文档最通用的语法是<<紧跟一个标识符,从下一行开始是想要引用的文字,然后再在单独的一行用相同的标识符关闭。在Unix shell里,here文档通常用于给命令提供输入内容。

其他用法

  1. 在<<后面添加一个减号,可以使TAB字元被忽略。
$ cat <<-EOF
>     aaa
>     bbb
EOF
aaa
bbb
  1. 使用引号包裹标识符来禁用变量替换和命令替换。可以使用单引号或双引号:
 $ cat << "EOF"
 > Working dir $PWD
 > EOF
 Working dir $PWD

因为默认地,会进行变量替换和命令替换:

 $ cat << EOF
 > Working dir $PWD
 > EOF
 Working dir /home/user

缘由

用 Python 调用一段 bash 脚本,之前的做法是把 bash 脚本写入文件,然后用 subprocess 调用 bash filename.sh 。但是文件名如果是固定的话,这脚本就不能并行运行了。所以就想到用 bash <<EOF 的办法。

-    cmd = "bash .tmp_run_shell.sh"
+    cmd = "bash << 'EOF'%sEOF" % script

一开始没给 EOF 加引号,导致 $ 符号相关的命令报错了。通过搜索才发现有加引号的办法,所以记录一下啊。

参考资料

点击进入评论 ...