分享基于 Python 的 強大Shell 語言和命令提示符
Xonsh 是一種基于 Python 的、跨平臺的、面向 Unix 的 shell 語言和命令提示符,它本質上是一個Python解釋器,具有運行 Shell 命令的良好語法。因此,在熟悉的Shell環(huán)境中,您擁有Python的所有功能。適用于所有主要系統(tǒng),包括 Linux、OSX 和 Windows。
Bash 腳本對于小型或批量應用程序來說既快速又有效。Bash 的限制之一是它處理數(shù)學函數(shù)和浮點數(shù)。
如果您是 Python 程序員,應該會非常喜歡,它擁有龐大的可用函數(shù)庫。
對于 Raspberry Pi 用戶,Xonsh 可以提供很多機會來編寫一些極其精簡的腳本。Python 可用于連接到第三方設備和傳感器。
在這篇文章中,我將通過一些示例來介紹 Xonsh。
入門
有關特定系統(tǒng)的安裝說明,請參閱 Xonsh 文檔。要在 Raspberry Pi/Ubuntu/Debian 上安裝,請輸入:
linuxmi@linuxmi:~/www.linuxmi.com$ sudo apt install xonsh
要運行 Xonsh,只需輸入:xonsh
開箱即用的 Xonsh 提供了一個配置向導和一個教程。
使用 Python
Python 代碼可以直接在命令行輸入。Python 的版本將取決于基礎系統(tǒng)上加載的內容。要檢查您的版本:
linuxmi@linuxmi ~/www.linuxmi.com $ import sys
linuxmi@linuxmi ~/www.linuxmi.com $ sys.version
'3.9.7 (default, Sep 10 2021, 14:59:43) \n[GCC 11.2.0]'
與交互式 Python 界面一樣,不需要打印語句即可查看輸出:
linuxmi@linuxmi ~/www.linuxmi.com $ 7+9
16
linuxmi@linuxmi ~/www.linuxmi.com $ a=5;b=6
linuxmi@linuxmi ~/www.linuxmi.com $ a+b
11
linuxmi@linuxmi ~/www.linuxmi.com $ i="Hello World!"
linuxmi@linuxmi ~/www.linuxmi.com $ i + " www.linuxmi.com"
'Hello World! www.linuxmi.com'
使用 Bash
Xonsh 首先使用 Python,因此以ls(Bash list 命令)為例:
在上面的例子中***ls***首先用作 Bash list 命令,但是如果定義了同名的變量,則引用該變量。
linuxmi@linuxmi ~/www.linuxmi.com $ ls
'VS Code.png' www.linuxmi.com.jpg www.linuxmi.com.py wwww.linuxmi.com
linuxmi.com www.linuxmi.com.mp4 www.linuxmi.png
linuxmi@linuxmi ~/www.linuxmi.com $ ls="這是一個變量www.linuxmi.com"
linuxmi@linuxmi ~/www.linuxmi.com $ ls
'這是一個變量www.linuxmi.com'
第一個ls用作Bash list命令,第2個是Xonsh顯示變量ls。
Xonsh 將 Bash 語句作為單行處理。這意味著:
- Bash for/while/if 語句需要全部在一行
- 記得在字符之間使用空格
- 不支持行擴展(帶有“\”)
- 不支持 Bash 函數(shù)。
- 您可以用 Python 而不是 Bash 編寫函數(shù)
在 Bash 中使用 Python
Python 語句在 Bash 中使用:@(Python statements)。下面是在 Bash 中使用 Python 的兩個示例:
linuxmi@linuxmi ~/www.linuxmi.com $ import sys
linuxmi@linuxmi ~/www.linuxmi.com $ echo @(sys.version)
3.9.7 (default, Sep 10 2021, 14:59:43)
[GCC 11.2.0]
linuxmi@linuxmi ~/www.linuxmi.com $ echo @("LinuxMi.com=" +str(8+9))
LinuxMi.com=17
例子
linuxmi@linuxmi ~/www.linuxmi.com $ from tkinter import *
linuxmi@linuxmi ~/www.linuxmi.com $ root = Tk()
linuxmi@linuxmi ~/www.linuxmi.com $ canvas = Canvas(root, width = 500, height =
500)
linuxmi@linuxmi ~/www.linuxmi.com $ canvas.pack()
linuxmi@linuxmi ~/www.linuxmi.com $ img = PhotoImage(file="www.linuxmi.com.png")
linuxmi@linuxmi ~/www.linuxmi.com $ canvas.create_image(0,0, anchor=NW, image=im
g)
1
linuxmi@linuxmi ~/www.linuxmi.com $ mainloop()
在 Python 中使用 Bash
Bash 變量可以直接在 Python 中使用,例如:
使用Bash date并將其傳遞給Python
linuxmi@linuxmi ~/www.linuxmi.com $ now=$(date)
linuxmi@linuxmi ~/www.linuxmi.com $ print("現(xiàn)在的時間是: " + now)
現(xiàn)在的時間是: 2022年 04月 01日 星期五 19:17:13 CST
問題
在不同的 shell 和子 shell 之間工作可能會有點混亂。我發(fā)現(xiàn)我有時會搞不清楚自己在哪個 shell 中工作。ps命令會告訴我xonsh*是否正在運行:
linuxmi@linuxmi ~/www.linuxmi.com $ ps
PID TTY TIME CMD
7966 pts/1 00:00:00 bash
8044 pts/1 00:00:04 xonsh
11342 pts/1 00:00:00 ps
我能夠在沒有任何問題的情況下將Xonsh腳本傳遞給Bash腳本,但我發(fā)現(xiàn)對于某些操作,我需要手動殺死Xonsh shell。
總結
Xonsh 適用于專家和新手的日常使用。與其他 shell 不同,xonsh 基于 Python,添加了額外的語法,使調用子進程命令、操作環(huán)境和處理文件系統(tǒng)變得容易。xonsh 命令提示符為用戶提供了對 xonsh 語言的交互式訪問。
對于尋求簡單腳本解決方案的用戶來說,Xonsh 具有很大的潛力。
就我自己而言,我可能會堅持使用 Bash 或 Python 解決方案,但我還有其他選擇。