Qual é a diferença entre shell, eshell e term no Emacs?

60

No Emacs, posso executar um shell usando os seguintes comandos -

M-x term

M-x shell

M-x eshell

Qual é a diferença entre esses três?

Kshitiz Sharma
fonte

Respostas:

61

shellé a mais antiga dessas três opções. Ele usa o Emacs comint-modepara executar um subshell (por exemplo bash). Nesse modo, você está usando o Emacs para editar uma linha de comando. O subprocesso não vê nenhuma entrada até você pressionar Enter. O Emacs está agindo como um terminal idiota. Ele suporta códigos de cores, mas não coisas como mover o cursor, então você não pode executar aplicativos baseados em maldições.

termé um emulador de terminal escrito em Emacs Lisp. Nesse modo, as teclas pressionadas são enviadas diretamente para o subprocesso; você está usando qualquer recurso de edição de linha que o shell apresente, não o Emacs. Também permite executar programas que usam recursos avançados de terminal, como o movimento do cursor (por exemplo, você pode executar nanoou lessdentro do Emacs).

eshellé um shell implementado diretamente no Emacs Lisp. Você não está executando bashou qualquer outro shell como um subprocesso. Como resultado, a sintaxe não é exatamente a mesma que bashou sh. Ele permite coisas como redirecionar a saída de um processo diretamente para um buffer Emacs (try echo hello >#<buffer results>).

cjm
fonte
19

De acordo com a página Xahlee :

shell é a interface padrão do emacs para a interface da linha de comandos do sistema operacional.

term(ansi-term é praticamente igual ao termo hoje. Eles eram pacotes diferentes, mas agora ambos definidos em term.el) são um emulador de terminal. Ele se comporta como um aplicativo de terminal dedicado, como {xterm, gnome-terminal, puTTY}. É compatível com mais aplicativos de shell do que a interface de shell do emacs, mas as teclas padrão do emacs, como mover o cursor, não funcionam aqui (porque está emulando um terminal).

eshellé um shell escrito inteiramente no emacs lisp. Nota: não é um emulador de bash. Eshell é uma concha por si só, mas semelhante à concha ou outras conchas.

Qual você deve usar?

Depende da sua preferência.

shell é bom para uso geral de comandos shell clássico / padrão do unix, como {grep, du, ls, sort, gato, cabeça, cauda, ​​uname,…}.

term & ansi-term são boas se você deseja executar coisas como ssh ou outra interface interativa de linha de comando (como {python, ruby, lisp} shell) ou aplicativo de GUI baseado em texto, como {vim, synaptic,…}.

eshell é bom, especialmente no Microsoft Windows onde o bash não está instalado ou, se você é um programador do emacs lisp, porque o eshell tem acesso direto ao emacs lisp.

CodyChan
fonte
Todos os comandos que você mencionou (grep, du, ls, etc.) são programas e comandos construídos no shell. eshelltambém os terá se você tiver esses programas instalados.
Bart Louwers
11
@Bart tente remover seu grep no seu sistema e faça a ação grep no eshell, você verá que o grep no eshell não é grep no seu sistema, which grepno eshll diz "eshell / grep é uma função Lisp compilada no` em- unix.el ', porque o grep no seu sistema pode ser executado no eshell, como eu disse, o eshell é muito útil no MS, pois muitas ferramentas pequenas como o grep não estão instaladas.
CodyChan