我尝试了多种方法在脚本中打印这一行:
alias myname='export PATH="/path/to/bin:$PATH"'
他们都有不同的问题。
我最后一次尝试(记住!)是:
printf '%s' '%s\n' 'alias myname=' ''\'"export PATH=\"/path/to/bin:$PATH\"" \''' >> ~/.bashrc
但它不起作用,它多次打印 PATH 目录并在前面alias myname
有%sn
(我更喜欢使用 printf)
答案1
如果我正确理解了这个问题,那么您正在尝试添加以下行
alias myname='export PATH="/path/to/bin:$PATH"'
到你的~/.bashrc
文件
明显的类型echo
会失败,因为 $PATH 在错误的时间扩展。
相反,我们需要进行一些引用混合:
echo "alias myname='export PATH=\"/path/to/bin:\$PATH\"'" >> ~/.bashrc
现在你说,出于某种原因,你想使用printf
.所以我们可以做类似的事情:
printf "%s\n" "alias myname='export PATH=\"/path/to/bin:\$PATH\"'" >> ~/.bashrc
如果要将 的两侧视为=
单独的字符串:
printf "%s=%s\n" "alias myname" "'export PATH=\"/path/to/bin:\$PATH\"'" >> ~/.bashrc
等等。
(printf
仅采用一个格式参数,然后是一个值列表)。
答案2
有两个简单的解决方案。一个是使用这里的文档而不是引号。使用此处文档的引用形式(其中该<<EOF
部分包含引号字符)可以关闭此处文档内的变量和命令替换。
cat <<\EOF >>~/.bashrc
alias myname='export PATH="/path/to/bin:$PATH"'
EOF
另一种是在要打印的字符串周围使用单引号。您可以通过使用'\''
— 结束单引号文字、追加文字单引号并开始新的单引号文字,有效地转义单引号文字中的单引号。
echo 'alias myname='\''export PATH="/path/to/bin:$PATH"'\'''
(您可以优化掉最终的空字符串文字''
。)
在某些 shell 上,echo
命令不会按字面打印其参数,这就是为什么打印字符串的可靠方法是使用printf
:
printf '%s\n' 'alias myname='\''export PATH="/path/to/bin:$PATH"'\'''
在这种特定情况下,echo
它也可以工作,因为它执行的唯一扩展涉及反斜杠和前导-
.