在 shell 命令中向 heredoc 输出添加反引号 ( ` )

Gro*_*ler 4 shell bash shell-script

我需要PS1="..."在我正在设置的 shell 脚本中添加一个 cmd 提示修饰符。问题是,我使用反引号在主命令之前执行命令:

sudo tee ~/.bashrc <<EOF

# Display absolute path in cmd line, cmds on new line
PS1='\[`[ $? = 0 ] && X=2 || X=1; tput setaf $X`\]\h [\u]\[`tput sgr0`\]:$PWD\n\$ '

EOF
Run Code Online (Sandbox Code Playgroud)

cat ~/.bashrc 给出:

# Display absolute path in cmd line, cmds on new line
PS1='\[\]\h [\u]\[\]:/Users/myuser/Library/Application Support/Sublime Text 3/Packages/User\n$ '
Run Code Online (Sandbox Code Playgroud)

nano ~/bashrc 给出:

PS1='\[^[[32m\]\h [\u]\[^[(B^[[m\]:/Users/myuser/Library/Application Support/Sublime Text 3/Packages/User\n$ '
Run Code Online (Sandbox Code Playgroud)

这显然意味着没有正确读取反引号中的所有内容。如何使用 shell 转义反引号或以其他方式将包含反引号的行写入文件?

Kus*_*nda 7

在 here-document 中,正如您所写的,shell 将进行参数扩展($PWD例如,在解析脚本时将扩展到当前目录的路径)、命令替换(“反引号”将执行,并且该命令产生的任何内容都将插入到它们的位置,在解析此处文档时)和算术扩展(在您的情况下都没有)。

如果您不希望这样,即您希望按原样交付 here-document 的内容,那么您可以这样做:

tee -a "$HOME/.bashrc" <<'EOF'

# contents of here-document here

EOF
Run Code Online (Sandbox Code Playgroud)

EOF第一行周围的撇号可防止外壳扩展此处文档本身中的任何内容。