mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-02-10 00:00:29 +08:00
translated
This commit is contained in:
parent
8ee629c469
commit
fb794e5087
@ -1,132 +0,0 @@
|
|||||||
translating---geekpi
|
|
||||||
|
|
||||||
Why I love Xonsh
|
|
||||||
======
|
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/shelloff.png?itok=L8pjHXjW)
|
|
||||||
|
|
||||||
Shell languages are useful for interactive use. But this optimization often comes with trade-offs against using them as programming languages, which is sometimes felt when writing shell scripts.
|
|
||||||
|
|
||||||
What if your shell also understood a more scalable programming language? Say, Python?
|
|
||||||
|
|
||||||
Enter [Xonsh][1].
|
|
||||||
|
|
||||||
Installing Xonsh is as simple as creating a virtual environment, running `pip install xonsh[ptk,linux]`, and then running `xonsh`.
|
|
||||||
|
|
||||||
At first, you might wonder why your Python shell has a weird prompt:
|
|
||||||
```
|
|
||||||
$ 1+1
|
|
||||||
2
|
|
||||||
```
|
|
||||||
|
|
||||||
Nice calculator!
|
|
||||||
```
|
|
||||||
$ print("hello world")
|
|
||||||
hello world
|
|
||||||
```
|
|
||||||
|
|
||||||
We can also call other functions:
|
|
||||||
```
|
|
||||||
$ from antigravity import geohash
|
|
||||||
$ geohash(37.421542, -122.085589, b'2005-05-26-10458.68')
|
|
||||||
37.857713 -122.544543
|
|
||||||
```
|
|
||||||
|
|
||||||
However, we can still use it like a regular shell:
|
|
||||||
```
|
|
||||||
$ echo "hello world"
|
|
||||||
hello world
|
|
||||||
```
|
|
||||||
|
|
||||||
We can even mix and match!
|
|
||||||
```
|
|
||||||
$ for i in range(3):
|
|
||||||
. echo "hello world"
|
|
||||||
.
|
|
||||||
hello world
|
|
||||||
hello world
|
|
||||||
hello world
|
|
||||||
```
|
|
||||||
|
|
||||||
Xonsh supports completion for both shell commands and Python expressions by using the [Prompt Toolkit][2]. Completions are visually informative, showing possible completions and having in-band dropdown lists.
|
|
||||||
|
|
||||||
It also supports environment access. It uses a simple but powerful heuristic for applying Python types to environment variables. The default is "string," but, for example, path variables are automatically lists.
|
|
||||||
```
|
|
||||||
$ '/usr/bin' in $PATH
|
|
||||||
True
|
|
||||||
```
|
|
||||||
|
|
||||||
Xonsh accepts either shell-style or Python-style boolean shortcut operators:
|
|
||||||
```
|
|
||||||
$ 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
|
|
||||||
```
|
|
||||||
|
|
||||||
This means that Python keywords are interpreted. If we want to print the title of a famous Dr. Seuss book, we need to quote the keywords.
|
|
||||||
```
|
|
||||||
$ echo green eggs "and" ham
|
|
||||||
green eggs and ham
|
|
||||||
```
|
|
||||||
|
|
||||||
If we do not, we are in for a surprise:
|
|
||||||
```
|
|
||||||
$ 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)
|
|
||||||
```
|
|
||||||
|
|
||||||
Virtual environments can get a little tricky. Regular virtual environments, depending as they do on Bash-like syntax, cannot work. However, Xonsh comes with its own virtual environment management system called `vox`.
|
|
||||||
|
|
||||||
`vox` can create, activate and deactivate environments in `~/.virtualenvs`; if you've used `virtualenvwrapper`, this is where the environments were.
|
|
||||||
|
|
||||||
Note that the current activated environment doesn't affect `x``onsh`. It can't import anything from an activated environment.
|
|
||||||
```
|
|
||||||
$ 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'
|
|
||||||
```
|
|
||||||
|
|
||||||
The first line enables `vox`: it is a `xontrib`, a third-party extension for Xonsh. The `xontrib` manager can list all possible `xontribs` and their current state (installed, loaded, or neither).
|
|
||||||
|
|
||||||
It's possible to write a `xontrib` and just upload it to `PyPi` to make it available. However, it's good practice to add it to the `xontrib` index so Xonsh knows about it in advance. This allows, for example, the configuration wizard to suggest it.
|
|
||||||
|
|
||||||
If you've ever wondered, "can Python be my shell?" then you are only a `pip install xonsh` away from finding out.
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
via: https://opensource.com/article/18/9/xonsh-bash-alternative
|
|
||||||
|
|
||||||
作者:[Moshe Zadka][a]
|
|
||||||
选题:[lujun9972](https://github.com/lujun9972)
|
|
||||||
译者:[译者ID](https://github.com/译者ID)
|
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
|
||||||
|
|
||||||
[a]: https://opensource.com/users/moshez
|
|
||||||
[1]: https://xon.sh/
|
|
||||||
[2]: https://python-prompt-toolkit.readthedocs.io/en/master/
|
|
130
translated/tech/20180904 Why I love Xonsh.md
Normal file
130
translated/tech/20180904 Why I love Xonsh.md
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
我为什么喜欢 Xonsh
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/shelloff.png?itok=L8pjHXjW)
|
||||||
|
|
||||||
|
Shell 语言对交互式使用很有用。但是在使用它们作为编程语言时这种优化需要权衡,这有时在编写 shell 脚本时会感觉到。
|
||||||
|
|
||||||
|
如果你的 shell 时一种更可伸缩的语言会怎样?比如说,Python?
|
||||||
|
|
||||||
|
进入 [Xonsh][1]。
|
||||||
|
|
||||||
|
安装 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][2] 补全 shell 命令和 Python 表达式。补全有可视化提示,会显示可能的补全并有下拉列表。
|
||||||
|
|
||||||
|
它还支持访问环境变量。它使用简单但强大的启发式方法将 Python 类型应用于环境变量。默认值为 “string”,但是,例如,路径变量是自动列表。
|
||||||
|
```
|
||||||
|
$ '/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 关键字是被解释了。如果我们想要打印著名的 Dr. Seuss 书的标题,我们需要引用关键词。
|
||||||
|
```
|
||||||
|
$ 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` 管理器可以列出所有可能的 `xontribs` 及其当前状态(已安装,已加载或未加载)。
|
||||||
|
|
||||||
|
可以编写一个 `xontrib` 并上传到 `PyPi` 以使其可用。但是,最好将它添加到 `xontrib` 索引中,以便 Xonsh 提前知道它。比如,这能让配置向导建议它。
|
||||||
|
|
||||||
|
如果你曾经想过,“Python 可以成为我的 shell 吗?”,然后你只要 `pip install xonsh` 一下就能知道。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/18/9/xonsh-bash-alternative
|
||||||
|
|
||||||
|
作者:[Moshe Zadka][a]
|
||||||
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[校对者ID](https://github.com/校对者ID)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/moshez
|
||||||
|
[1]: https://xon.sh/
|
||||||
|
[2]: https://python-prompt-toolkit.readthedocs.io/en/master/
|
Loading…
Reference in New Issue
Block a user