如何用Python替换bash?


13

根据对此SO问题的公认答案:,Python可以替代bash

那么我的问题是:我该如何进行无缝切换?我认为要进行这样的切换的主要事情是:启动虚拟终端时,调用一些Python Shell(虽然?),而不是像Bourne Shell这样的东西。

那有意义吗?如果是,我该怎么做?Wikipedia对常见shell的比较未列出单个Python shell:命令shell的比较

Answers:


16

该线程及其公认的答案特别是关于使用Python进行shell 脚本编写,而不是作为交互式 shell。

要用其他语言编写脚本,请在脚本顶部放置例如#!/usr/bin/env python而不是#!/bin/bash

如果您想尝试其他交互式shell,请运行它,例如ipython,在现有的shell提示符下键入。如果您决定采用该shell,请SHELL在会话开始时(~/.profile在大多数环境中或中~/.pam_environment)设置环境变量,例如export SHELL=/usr/bin/ipython.profile语法)或SHELL="/usr/bin/ipython".pam_environment语法)。

我认为,基于Perl或Python等高级语言的shell尚不足以用于交互式使用。对于常见任务,它们太冗长了,特别是启动应用程序的Shell的常见工作。我4年前写过一个类似的话题 ; 从那以后,我认为情况没有根本改善。


14

我知道这个问题现在已经很老了,但是有一个新的基于Python 3超集的shell,称为xonsh,这可能正是您要寻找的。

从网站:

Xonsh是一种类似Python的BASHwards外观的Shell语言和命令提示符。该语言是Python 3.4+的超集,其中包含您习惯于Bash和IPython使用的其他shell原语。它适用于所有主要系统,包括Linux,Mac OSX和Windows。Xonsh是供专家和新手使用的日常工具。

在xon.sh上看到它


2

而不是

原因是Python不支持处理提升的特权。最坏的情况是编辑系统文件。

比较

sudo sed -i -e "/\#LXC_DOMAIN/ s/\#//" /etc/default/lxc-net

与:

out = subprocess.run('''sudo sed -i -e "/\#LXC_DOMAIN/ s/\#//" /etc/default/lxc-net''', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,env={"PATH": "/usr/bin"})

您不能对系统文件使用Python的本机文件处理,因为Python本质上无法执行具有提升特权的子命令。


1
我不知道为什么sudo比其他的都要差。如果需要sudo,则需要运行/ usr / bin / sudo,该程序与其他程序一样。您的特定示例在此展示了难以理解外壳思维并从Python使用它的困难。可能有更好的方法,但这将是不太直接的翻译。
rosuav

1

Ipython没问题。另外,请查看“ os”库。


没错,IPython应该是一个显而易见的选择...但是如何让IPython自动在终端仿真器或实际终端中启动?
2014年

命令:chfn -s $(其中ipython)
user400344

出现乱码...只是:chfn -s $(ipython)...确保ipython的完整路径在/ etc / shells中。
user400344 2014年

另一个选择是exec ipython从当前的shell启动文件中获取文件,例如.bashrc
ptman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.