Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unix << 符号的使用 #72

Open
hanxi opened this issue May 13, 2021 · 0 comments
Open

Unix << 符号的使用 #72

hanxi opened this issue May 13, 2021 · 0 comments

Comments

@hanxi
Copy link
Owner

hanxi commented May 13, 2021

常见的场景

$ 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 加引号,导致 $ 符号相关的命令报错了。通过搜索才发现有加引号的办法,所以记录一下啊。

参考资料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant