常见的场景
$ 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文档通常用于给命令提供输入内容。
其他用法
- 在<<后面添加一个减号,可以使TAB字元被忽略。
$ cat <<-EOF
> aaa
> bbb
EOF
aaa
bbb
- 使用引号包裹标识符来禁用变量替换和命令替换。可以使用单引号或双引号:
$ 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 加引号,导致 $
符号相关的命令报错了。通过搜索才发现有加引号的办法,所以记录一下啊。