在bash中转义单引号的推荐方法 - 双引号,反斜杠或其他东西?

时间:2013-07-13 17:22:01

标签: bash escaping

我想直接在命令行中将alias foo='bar'附加到我的bash配置文件的末尾,我知道有两种方法可以做 - 用反斜杠转义单引号,或用双引号括起命令,即:

  1. echo alias foo=\'bar\' >> ~/.bash_profile
  2. echo "alias foo='bar'" >> ~/.bash_profile
  3. 一种方法被认为比另一种更“安全”吗?两者都按预期工作,但我想知道的是,如果其中一种方法在以其他方式使用时导致意外行为的可能性较低,或者是否存在一些其他推荐的方法来转义单引号(在此特定上下文中)是最容易出错的。

2 个答案:

答案 0 :(得分:2)

您的两个命令略有不同,因为echo alias foo=\'bar\'将两个参数传递给echo(即aliasfoo='bar'),而echo "alias foo='bar'"仅传递一个(即alias foo='bar')。由于echo打印所有以空格分隔的参数,因此在您的情况下这相同,但在一般情况下值得记住。

但是,使用您发布的实际命令,无论如何都不需要单引号 - 命令alias foo='bar'等同于命令alias foo=bar - 所以通常的写法它是:

echo 'alias foo=bar' >> ~/.bash_profile

在更一般的情况下,bar可以是任何命令,我仍然用单引号将整个事物包装起来以确保不会发生杂散扩展或分词,例如:

echo 'alias foo='\''command with * and ? and spaces'\' >> ~/.bash_profile

(而你的第一个版本,应用于这样的命令,会非常糟糕;你的第二个版本会很好地处理这个案例,但是如果参数扩展或命令中有什么别名的话,它仍会破坏。)

答案 1 :(得分:0)

如果你试图写,可能导致困难的情况 你提到的文件行:

file.txt << !
echo alias foo=\'bar\' >> ~/.bash_profile
echo "alias foo='bar'" >> ~/.bash_profile
!

您可以检查file.txt以查看输出是否符合您的预期。