hanxi / blog

涵曦的博客
https://blog.hanxi.cc
56 stars 5 forks source link

Unix << 符号的使用 #72

Open hanxi opened 3 years ago

hanxi commented 3 years ago

常见的场景

$ 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
  2. 使用引号包裹标识符来禁用变量替换和命令替换。可以使用单引号或双引号:
    $ 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 加引号,导致 $ 符号相关的命令报错了。通过搜索才发现有加引号的办法,所以记录一下啊。

参考资料