簡體   English   中英

使用 echo 寫入文件的換行符在 shell 中有效,但在 Python 3 中為文字

[英]Newline character written to file with echo works in shell, but literal in Python 3

我在Ubuntu 20.04系統上,我正在使用Python 3.8編寫一個腳本,該腳本使用可配置的 bash 行執行多項操作,但其中之一是它創建了桌面快捷方式。

這個單行命令創建了一個桌面快捷方式,當我直接在終端中執行它時可以完美運行

echo "[Desktop Entry]"$'\n'"Type=Application"$'\n'"Name[en_US]=Documents"$'\n'"Exec=pcmanfm ~/Documents"$'\n'"Icon=system-file-manager" > ~/Desktop/1;

但是,當我在 Python 中執行它時,如下所示:

foobar.py

rl = """echo "[Desktop Entry]"$'\n'"Type=Application"$'\n'"Name[en_US]=Documents"$'\n'"Exec=pcmanfm ~/Documents"$'\n'"Icon=system-file-manager" > ~/Desktop/1;"""
subprocess.run(rl, shell=True)

...它不是創建具有正確名稱、圖標和操作的桌面快捷方式,而是創建一個包含以下文本的空文件

0.txt

[Desktop Entry]$\nType=Application$\nName[en_US]=Sign Out$\nExec=/home/agent/QaSC/login/login.bin$\nIcon=system-switch-user

是否有任何特殊原因導致 Python 處理換行符的方式與 bash shell 不同,如果是,我該如何解決這個問題?

$'...'是一個bash擴展,但指定shell=True時使用的默認 shell 是sh 使用executable選項指定備用外殼。

subprocess.run(rl, shell=True, executable='/bin/bash')

由於echo的參數有引號,它可以在命令行中包含文字換行符,因此也在 Python 進程中。 我認為沒有理由使用 Bash 擴展$'\n'語法。

$ echo "foo
> bar"
foo
bar
$ python
Python 3.8.10 (default, Mar 15 2022, 12:22:08) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.run('echo "foo\nbar"', shell=True)
foo
bar
CompletedProcess(args='echo "foo\nbar"', returncode=0)
>>> 

(也不清楚為什么 Python 代碼不只是以正常方式編寫文件,但我認為 OP 中的命令本質上是一個占位符。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM