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

在bash中转义单引号的推荐方法-双引号、反斜杠或其他?,bash,escaping,Bash,Escaping,我想直接在命令行中将alias foo='bar'附加到bash概要文件的末尾,我知道两种方法——用反斜杠转义单引号,或用双引号括住命令,即: echo别名foo=\'bar\'>>~/.bash\u配置文件 echo“alias foo='bar'”>~/.bash\u profile 一种方法被认为比另一种更“安全”吗?这两种方法都能按预期工作,但我想知道的是,当以其他方式使用时,这些方法中的一种是否导致意外行为的概率较低,或者是否有其他建议的方式来转义单引号(在这个特定上下文中),这是最不

我想直接在命令行中将
alias foo='bar'
附加到bash概要文件的末尾,我知道两种方法——用反斜杠转义单引号,或用双引号括住命令,即:

  • echo别名foo=\'bar\'>>~/.bash\u配置文件
  • echo“alias foo='bar'”>~/.bash\u profile

  • 一种方法被认为比另一种更“安全”吗?这两种方法都能按预期工作,但我想知道的是,当以其他方式使用时,这些方法中的一种是否导致意外行为的概率较低,或者是否有其他建议的方式来转义单引号(在这个特定上下文中),这是最不容易出错的

    您的两个命令略有不同,
    echo alias foo=\'bar\
    将两个参数传递给
    echo
    (即
    alias
    foo='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
    

    (而应用于此类命令的第一个版本的行为会非常糟糕;第二个版本可以很好地处理这种情况,但如果命令中存在参数扩展或其他别名,则仍然会中断)。

    可能导致困难的情况是,如果您尝试编写 您在文件中提到的行:

    file.txt << !
    echo alias foo=\'bar\' >> ~/.bash_profile
    echo "alias foo='bar'" >> ~/.bash_profile
    !
    
    file.txt>~/.bash\u配置文件
    echo“alias foo='bar'”>~/.bash\u配置文件
    !
    

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

    您所说的“以其他方式使用时”是什么意思@armando我基本上是在询问最佳做法,因为这两种方法在外观上似乎同样有效,但可能还有其他一些事情发生在引擎盖下,只有在我没有考虑到的不同上下文中才会变得明显(例如多行字符串)。例如,如果有一些我没有考虑的场景,用反斜杠转义比用双引号括起来好/坏,因为它会导致意外的结果,例如shell扩展。