为什么 echo 的这个“-e”选项会写入文件(尽管没有用双引号括起来)?

为什么 echo 的这个“-e”选项会写入文件(尽管没有用双引号括起来)?
#!/usr/bin/env python3

from subprocess import run
from sys import modules

def main():
  doas()

def doas():
  ch = input("Ready to proceed with setting up doas?[Y/n]?")
  if ch == 'y':
    run("sudo passwd", shell=True)#If you would prefer to access the root account with su or by logging in directly, you must set a root password with "sudo passwd".
    run("sudo apt install -y doas", shell=True) 
    run("""echo -e "permit $(whoami) as root 
permit root as $(whoami)
permit nopass root as $(whoami)"|sudo tee /etc/doas.conf""", shell=True) and run("doas apt -y purge sudo", shell=True)
    print("doas set up.")
  else:
    print("Run me again when you are ready.")

这段代码的问题在于它将选项放在-edoas.conf,如下所示:

-e permit jim as root
permit root as jim
permit nopass root as jim

虽然我需要doas.conf看起来像这样:

permit jim as root
permit root as jim
permit nopass root as jim

我知道最简单的快速解决方法就是不使用-ewith echo。我还有其他方法可以解决这个问题吗?

如果没有用双引号括起来,为什么-e最终会被写入?doas.conf当我跑步时

echo -e "permit $(whoami) as root 
permit root as $(whoami)
permit nopass root as $(whoami)"|tee doas.conf

从我的 shell (Bash) 中,然后一切正常,我得到了想要的结果。为什么它与Python不同?我使用的是 Ubuntu 22.04 LTS,我的 echo 似乎支持 -e,例如 echo -e "a\nb\nc" 它会打印带有换行符的字母。

答案1

因为不同的实现echo要么支持或不支持像-eand 之类的选项,要么处理或不处理像and 之-n类的 C 风格反斜杠转义符。\n\t

一个标准echo确实不是采取选择:

回声实用程序不得按照 XBD 实用程序语法指南指南 10 指定的方式识别“--”参数; “--”应被识别为字符串操作数。

实现不应支持任何选项。

代替使用printf。看:为什么 printf 比 echo 更好?


引号(双引号或单引号)与之无关,因为它们是在命令运行之前由 shell 处理的,并有机会处理其选项。在所有的

echo -e foo
echo "-e" foo
echo '-e' foo

echo命令看到两个参数-efoo

相关内容