この「-e」オプションがファイルにエコー書き込みを実行するのはなぜですか(二重引用符で囲まれていませんが)。 [コピー]

この「-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.")

このコードの問題は、オプションを次のように配置すること-eですdoas.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

私が知っている最も簡単な迅速な修正は、一緒-eに使用しないことですecho。この問題を解決する他の方法はありますか?

二重引用符で囲まないと、なぜ-e作成が終わりますか?doas.conf私が走るとき

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

私のシェルでは、すべてがうまく機能し、必要な結果が得られます。 Pythonとなぜ違いますか?私はUbuntu 22.04 LTSを使用していますが、私のechoは-eをサポートしているようです。たとえば、echo -e "a\nb\nc" 改行で文字を印刷します。

答え1

他の実装は、andなどのオプションをechoサポートまたはサポートしないか、andなどのCスタイルのバックスラッシュエスケープを-e処理または処理しないためです。-n\n\t

echoさすが標準いいえ選ぶ:

これエコユーティリティは、XBDユーティリティ構文ガイド10で指定されているように、「--」パラメータを認識しません。 「--」は文字列オペランドとして認識されます。

実装はどのオプションもサポートしてはいけません。

代わりに使用してくださいprintf。望むより:なぜprintfがechoより優れているのですか?


引用符(二重引用符または一重引用符)は、コマンドが実行される前にシェルで処理され、そのオプションを処理する機会があるため関係ありません。全体的に

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

このechoコマンドには2つのパラメータ-eとが表示されますfoo

関連情報