Usar :sh
cria um novo processo - um processo filho do processo vi
- e executa um novo shell. :sus
coloca o editor em um estado suspenso e permite que o processo pai (normalmente, seu shell de login ou o shell principal na janela) retome o controle.
Portanto, :sh
usa marginalmente mais recursos. Mas a maior diferença é que se você executar :sh
e, em seguida, cd
(diretório de mudanças), definir uma variável de shell / variável de ambiente, alterar um limite de processo ( ulimit
) ou qualquer outra coisa que afete diretamente o shell então esses efeitos desaparecerão quando você retornar ao editor (ao sair do shell).
Por outro lado, se você voltar ao seu shell principal, os efeitos ainda estarão lá quando você sair do editor.
A resposta de Ingo sobre as variáveis de shell (não exportadas) no shell pai que não estão disponíveis na subshell também está correta.
Ah, outra coisa: :sh
provavelmente fornecerá uma instância do shell nomeado por $SHELL
. Se a sua shell pai é algo diferente, então, obviamente, isso será outra diferença.
Editar:
Oh, outra coisa que eu pensei: dependendo do shell que você está usando (bash, C shell, zsh, etc.) e quais configurações você tem em vigor, uma subshell provavelmente não terá acesso ao shell principal. histórico de comandos (por exemplo, !-2
ou ↑ ↑ ).
Como um corolário trivial, que você provavelmente já observou, o fg
que você deve digitar para voltar ao editor depois de um :sus
ser adicionado ao histórico de comandos do shell principal. Eu costumo salvar e sair do editor, e depois digo imediatamente para mim mesmo: “Oh! Esqueci de mudar «Humpty» para «Dumpty». », E digite !!
Enter para voltar ao editor, apenas para ser pego de surpresa pelo fato de que !!
aparece o comando fg
.
No bash, você pode evitar isso configurando HISTIGNORE
para fg
(ou adicionando fg
,
delimitado por um :
, para sua lista HISTIGNORE
existente, se houver).