为什么我喜欢 Xonsh

有没有想过 Python 可以成为你的 shell 吗?
235 位读者喜欢这篇文章。
Shells in a competition

Opensource.com

Shell 语言对于交互式使用非常有用。但是,这种优化通常会牺牲将它们用作编程语言的优势,这在编写 shell 脚本时有时会感受到。

如果你的 shell 也理解一种更具扩展性的编程语言会怎样?比如说,Python?

了解一下 Xonsh

安装 Xonsh 非常简单,只需创建一个虚拟环境,运行 pip install xonsh[ptk,linux],然后运行 xonsh 即可。

起初,你可能会想知道为什么你的 Python shell 有一个奇怪的提示符

$ 1+1
2

不错的计算器!

$ print("hello world")
hello world

我们还可以调用其他函数

$ from antigravity import geohash
$ geohash(37.421542, -122.085589, b'2005-05-26-10458.68')
37.857713 -122.544543

但是,我们仍然可以像使用常规 shell 一样使用它

$ echo "hello world"
hello world

我们甚至可以混合搭配!

$ for i in range(3):
.     echo "hello world"
.
hello world
hello world
hello world

Xonsh 通过使用 Prompt Toolkit 支持 shell 命令和 Python 表达式的补全。补全功能在视觉上信息丰富,显示可能的补全项并具有带内下拉列表。

它还支持环境访问。它使用一个简单但强大的启发式方法将 Python 类型应用于环境变量。默认值为“字符串”,但例如,路径变量会自动成为列表。

$ '/usr/bin' in $PATH
True

Xonsh 接受 shell 样式或 Python 样式的布尔快捷运算符

$ cat things
foo
$ grep -q foo things and echo "found"
found
$ grep -q bar things && echo "found"
$ grep -q foo things or echo "found"
$ grep -q bar things || echo "found"
found

这意味着 Python 关键字会被解释。如果我们想打印一本著名的苏斯博士书籍的标题,我们需要引用这些关键字。

$ echo green eggs "and" ham
green eggs and ham

如果我们不这样做,我们会感到惊讶

$ echo green eggs and ham
green eggs
xonsh: For full traceback set: $XONSH_SHOW_TRACEBACK = True
xonsh: subprocess mode: command not found: ham
Did you mean one of the following?
    as:   Command (/usr/bin/as)
    ht:   Command (/usr/bin/ht)
    mag:  Command (/usr/bin/mag)
    ar:   Command (/usr/bin/ar)
    nm:   Command (/usr/bin/nm)

虚拟环境可能会变得有点棘手。常规虚拟环境依赖于类似 Bash 的语法,因此无法工作。但是,Xonsh 自带了自己的虚拟环境管理系统,名为 vox

vox 可以在 ~/.virtualenvs 中创建、激活和停用环境;如果你使用过 virtualenvwrapper,这就是环境所在的位置。

请注意,当前激活的环境不会影响 xonsh。它无法从激活的环境中导入任何内容。

$ xontrib load vox
$ vox create my-environment                                                    
...
$ vox activate my-environment        
Activated "my-environment".                                                     
$ pip install money                                                            
...
$ python                                                              
...
>>> import money                                                               
>>> money.Money('3.14')                        
$ import money
xonsh: For full traceback set: $XONSH_SHOW_TRACEBACK = True
ModuleNotFoundError: No module named 'money'

第一行启用 vox:它是一个 xontrib,是 Xonsh 的第三方扩展。 xontrib 管理器可以列出所有可能的 xontrib 及其当前状态(已安装、已加载或两者都不是)。

可以编写一个 xontrib 并将其上传到 PyPi 以使其可用。但是,最佳实践是将其添加到 xontrib 索引,以便 Xonsh 提前了解它。例如,这允许配置向导建议它。

如果你曾经想知道“Python 可以成为我的 shell 吗?”,那么你只需 pip install xonsh 即可找到答案。

Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
自 1998 年以来,Moshe 一直参与 Linux 社区,帮助举办 Linux “安装派对”。自 1999 年以来,他一直在编写 Python 程序,并为核心 Python 解释器做出了贡献。 Moshe 自 DevOps/SRE 这些术语出现之前就一直是 DevOps/SRE,他非常关心软件可靠性、构建可再现性以及其他此类事情。

2 条评论

我从没想过 Python 可以成为我的 shell,但这真是太酷了!

感谢撰写这篇文章!我们非常感谢!

Creative Commons License本作品根据 知识共享许可协议 4.0 版本国际许可协议授权。
© . All rights reserved.