이 "-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

내 쉘(Bash)에서는 모든 것이 잘 작동하고 원하는 결과를 얻습니다. 파이썬과 왜 다른가요? 나는 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명령에는 두 개의 매개변수 -e와 가 표시됩니다 foo.

관련 정보