Como posso substituir o bash pelo Python?

13

De acordo com a resposta aceita para essa pergunta do SO:, o Python pode fazer uma excelente substituição do bash .

Minha pergunta, então, é a seguinte: como faço para fazer uma troca sem interrupções? Eu acho que a principal coisa a ser feita para fazer essa troca seria: ao iniciar um terminal virtual, chame algum shell Python (o que?), Em vez de algo como o shell Bourne.

Isso faz sentido? Se sim, como eu poderia fazer isso? Esta comparação da Wikipedia de shells comuns não lista um único shell Python: Comparação de shells de comando

user89
fonte

Respostas:

15

Esse segmento e sua resposta aceita, em particular, são sobre o uso de Python para scripts de shell , não como um recurso interativo. shell .

Para escrever scripts em um idioma diferente, coloque, por exemplo, em #!/usr/bin/env pythonvez de#!/bin/bash na parte superior do seu script.

Se você quiser experimentar um shell interativo diferente, basta executá-lo, por exemplo, digite ipythonno prompt do shell existente. Se você decidiu adotar esse shell, defina a SHELLvariável de ambiente no início da sua sessão ( ~/.profilena maioria dos ambientes ou em ~/.pam_environment), por exemplo export SHELL=/usr/bin/ipython( .profilesintaxe) ou SHELL="/usr/bin/ipython"(.pam_environment sintaxe).

Nenhum dos shells que eu vi baseados em linguagens avançadas como Perl ou Python são bons o suficiente para uso interativo na minha opinião. Eles são muito detalhados para tarefas comuns, especialmente o trabalho comum de um shell que é iniciar um aplicativo. Eu escrevi sobre um tópico semelhante há 4 anos ; Não acho que a situação tenha melhorado fundamentalmente desde então.

Gilles 'SO- parar de ser mau'
fonte
14

Eu sei que essa pergunta é bastante antiga agora, mas existe um novo shell baseado em um superconjunto do Python 3 chamado xonsh, que pode ser o que você está procurando.

a partir do site:

O Xonsh é uma linguagem de shell e prompt de comando com aparência BASHwards e Python. A linguagem é um superconjunto do Python 3.4+ com primitivas de shell adicionais às quais você está acostumado do Bash e IPython. Ele funciona em todos os principais sistemas, incluindo Linux, Mac OSX e Windows. Xonsh é destinado ao uso diário de especialistas e novatos.

Veja em xon.sh

Ian Sudbery
fonte
2

Melhor não

O motivo é que o Python não tem suporte para lidar com privilégios elevados. O pior caso é com a edição de arquivos do sistema.

Comparar

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

com:

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"})

Você não pode usar o tratamento de arquivos nativo do Python para arquivos do sistema, porque o Python é inerentemente incapaz de executar subcomandos com privilégios elevados.

Adam Ryczkowski
fonte
1
Não sei por que o sudo é pior do que qualquer outra coisa. Se você precisar do sudo, execute / usr / bin / sudo, que é um programa como outro qualquer. Seu exemplo específico aqui mostra a dificuldade em pegar a mentalidade de shell e usá-la no Python; uma maneira melhor pode ser possível, mas seria uma tradução menos direta.
rosuav
1

Ipython está ok. Além disso, veja a biblioteca 'os'.

user400344
fonte
Você está certo, o IPython deveria ter sido uma escolha óbvia ... mas como faço para que o IPython inicie dentro de um emulador de terminal ou dentro de um terminal real automaticamente?
user89
O comando: chfn -s $ (what ipython)
user400344
Isso saiu ilegível ... Apenas: chfn -s $ (qual ipython) ... Verifique se o caminho completo para o ipython está em / etc / shells.
user400344
outra opção é exec ipythonpartir do arquivo de inicialização do shell atual, como.bashrc
ptman