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?


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.


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).


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.