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
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$ '
nano ~/bashrc
给出:
PS1='\[^[[32m\]\h [\u]\[^[(B^[[m\]:/Users/myuser/Library/Application Support/Sublime Text 3/Packages/User\n$ '
这显然意味着反引号中的所有内容都没有正确读取。如何使用 shell 转义反引号或以其他方式将包含反引号的行写入文件?
答案1
在此处文档中,正如您所写的那样,shell 会执行此操作参数扩展($PWD
例如,在解析脚本时将扩展到当前目录的路径),命令替换(在解析此处文档时,将执行“反引号”,并且该命令生成的任何内容都将插入其位置)算术展开(在你的情况下都没有)。
如果您不希望这样做,即您希望按原样交付此处文档的内容,那么您可以这样做:
tee -a "$HOME/.bashrc" <<'EOF'
# contents of here-document here
EOF
第一行周围的撇号EOF
可防止 shell 扩展此处文档本身中的任何内容。