O vim não pode executar o comando unix com:! devido à mudança de casca

8

Nossa empresa usa o sistema linux da red hat e aloca para todos uma conta em / home. Infelizmente, nosso sistema está usando o tsch, o que não é favorável para mim. Além disso, como não tenho a permissão de superusuário, não posso usar o comando chsh para mudar para o bash por mim mesmo. Pior ainda, o ypchsh também não está disponível para mim. Então, finalmente, adiciono as seguintes linhas no .cshrc:

    bash
    echo $0

e configure o .bashrc adequadamente (copiando do .cshrc original e corrigindo o erro de sintaxe necessário). Agora, o aparente shell se torna bash (como pode ser mostrado no comando "echo $ 0").

Agora, o problema surge:

Quando uso o vim para editar um arquivo cpp (por exemplo, Hello_World) e uso ":! G ++ -g Hello_World.cpp -o hw.out" no vim para compilar o arquivo, nenhum resultado será mostrado e o vim é encerrado com "bash" mostrado (como quando um terminal está aberto), mas sem o habitual "pressione uma tecla" para voltar ao meu trabalho no vim. Na pasta Hello_World.cpp, há um arquivo .Hello_World.cpp.swp, mas não hw.out. Quando o vim Hello_World.cpp novamente, verifica-se que esse arquivo cpp foi aberto.

No entanto, se eu g ++ o arquivo cpp na pasta, mas não usando o vim e:!, Tudo está bem. De fato, :! agora parece ser ilegal para o vim.

Se eu usar o tcsh original, tudo ficará bem.

Como posso corrigir esse erro curioso?

Agradecemos sua ajuda antecipada.

qing

BTW: Eu prefiro o bash ao tcsh principalmente devido à sua conveniência de HISTIGNORE e HISTCONTROL, embora o tcsh também tenha a configuração histdup.

Achei o seguinte um pouco útil, mas ainda não satisfatório para o meu problema.

Como executar comandos Unix no Vim?

JQK
fonte
Use chshpara alterar seu shell de login.
Ярослав Рахматуллин 4/12/12

Respostas:

8

Coloque isso no seu script .login:

setenv SHELL /bin/bash
exec bash -l

A primeira linha define a variável de ambiente SHELL. A segunda linha substitui o tcshpor bash, mas diz para ele ser executado como um shell de login ( basho processo será processado .profileetc.). Você pode adicionar uma -iopção para torná-lo interativo; não deve ser necessário.

Jonathan Leffler
fonte
2
Você também pode colocar set shell=/bin/bashdentro do VIM. Dessa forma, você pode manter seu shell, mas use o BASH no VIM e evite os !problemas. No entanto, vejo que o OP prefere o bash de qualquer maneira, portanto, sua solução não apenas resolverá o problema do VIM, mas fornecerá ao OP seu shell preferido.
David W.
Você está certo, @ DavidW. Como qualquer pessoa pode definir seu shell em vim(ou vi) como quiser, é basicamente impossível restringir o acesso a um sistema se você permitir que o usuário acesse viou vim. Antigamente, as pessoas tentavam definir o shell para um programa especial que apenas executava certos comandos. No entanto, se um desses comandos for vior vim, eles terão acesso ao sistema de qualquer maneira.
Jonathan Leffler
Lamento que, como sou novato neste site, não sei como comentar essa resposta antes. Muito obrigado pela sua ajuda. @JonathanLeffler & DavidW.
JQK 02/12/12
2

O shell padrão para qualquer usuário é armazenado no arquivo / etc / passwd. O usuário pode alterar seu shell padrão para qualquer um dos shells listados em / etc / shells, emitindo o chshcomando Consulte as páginas de manual do chsh (1) e shells (5) para obter mais informações.

Esta resposta é "mais correta" do que a abordagem de substituir o shell atual após o login, porque é desnecessário iniciar o shell indesejado em primeiro lugar. Essa abordagem é útil apenas quando o administrador negligenciou o arquivo / etc / shells e esqueceu de adicionar o bash a ele (nunca).

Ярослав Рахматуллин
fonte
Olá , Pax, obrigado pela sua resposta. Mas não tenho permissão para executar o comando chsh. O administrador também não deseja usar o chsh para alterar meu shell. Obrigado a todos.
JQK
1

Obrigado por toda a sua grande ajuda.

Antes de dar a solução final que escolhi, devo apontar um erro na minha pergunta original. Meu arquivo .cshrc original possui as três linhas a seguir:

     bash
     source ~/.bashrc
     echo $0

Eu senti falta de digitar a segunda linha antes. Desculpa.

Agora, tentei esses dois métodos e os resultados são mostrados abaixo.

1) método .vimrc

Se eu escrever

     bash
     source ~/.bashrc
     echo $0

em ~ / .cshrc

e

     set shell=/bin/bash

em ~ / .vimrc

sem qualquer arquivo ~ / .login, o vim e:! g ++ está OK, mas:! gdb a.out tem algum erro. Além disso, "echo $ 0" fornece "bash", mas "echo $ SHELL" fornece "/ bin / tcsh". Não sei exatamente a diferença entre $ 0 e $ SHELL.

2) método .login

Se eu escrever

     setenv SHELL /bin/bash
     bash
     source ~/.bashrc
     echo $0

em .login

mas nem algo como "set shell = ..." em ~ / .vimrc nem "bash ..." em ~ / .cshrc, está tudo bem. Agora, "echo $ 0" fornece "bash" e "echo $ SHELL" fornece "/ bin / bash".

O bash na segunda linha pode ser substituído por "bash -l". Deve-se observar que, se eu o substituir por "exec bash" ou "exec bash -l", não poderei efetuar login na minha conta. (O sistema fecha automaticamente rapidamente.) Também não sei o porquê.

Eu acho que o segundo método é ótimo. Eu aprecio muito a sua ajuda.

JQK
fonte