vim non può eseguire il comando unix con:! a causa del cambio di shell


8

La nostra azienda utilizza il sistema Red Hat Linux e alloca a tutti un account in / home. Sfortunatamente, il nostro sistema utilizza tsch, il che non è favorevole per me. Inoltre, poiché non ho il permesso per superutente, non posso usare il comando chsh per cambiare da solo a bash. Ancora peggio, anche ypchsh non è disponibile per me. Quindi, alla fine, aggiungo le seguenti righe in .cshrc:

    bash
    echo $0

e configurare il .bashrc in modo appropriato (copiando dal file .cshrc originale e correggendo l'errore di sintassi necessario). Ora la shell apparente diventa bash (come si può vedere dal comando "echo $ 0").

Ora il problema si presenta:

Quando uso vim per modificare un file cpp (ad es. Hello_World) e uso ":! G ++ -g Hello_World.cpp -o hw.out" in vim per compilare il file, nessun risultato verrà mostrato e vim verrà chiuso con "bash" mostrato (come quando un terminale è aperto), ma senza il solito "premere un tasto" per tornare al mio lavoro in vim. Nella cartella Hello_World.cpp, c'è un file .Hello_World.cpp.swp, ma non hw.out. Quando vim Hello_World.cpp di nuovo, si scopre che questo file cpp è stato aperto.

Tuttavia, se g ++ il file cpp nella cartella ma non usando vim e:!, Tutto è OK. Infatti, :! ora sembra essere illegale per vim.

Se uso l'originale tcsh, va tutto bene.

Come posso risolvere questo curioso errore?

Grazie per il vostro gentile aiuto in anticipo.

qing

A proposito: preferisco bash a tcsh principalmente per la sua convenienza di HISTIGNORE e HISTCONTROL, sebbene tcsh abbia anche l'impostazione histdup.

Ho trovato quanto segue un po 'utile ma ancora non soddisfacente per il mio problema.

Come eseguire i comandi Unix da Vim?


Utilizzare chshper modificare la shell di accesso.
Ярослав Рахматуллин,

Risposte:


8

Inserisci questo nel tuo script .login:

setenv SHELL /bin/bash
exec bash -l

La prima riga imposta la variabile di ambiente SHELL. La seconda riga sostituisce tcshcon bash, ma dice di essere eseguita come shell di login (quindi bashelaborerà il tuo .profileetc). È possibile aggiungere -iun'opzione per renderlo interattivo; non dovrebbe essere necessario.


2
Puoi anche inserire set shell=/bin/bashVIM. In questo modo, puoi mantenere la tua shell, ma usa BASH in VIM ed evita i !problemi. Tuttavia, vedo che OP preferisce bash comunque, quindi la tua soluzione non solo risolverà il problema VIM, ma fornirà a OP la shell preferita.
David W.

Hai ragione, @DavidW. Dato che chiunque può impostare la propria shell in vim(o vi) su ciò che desidera, è praticamente impossibile limitare l'accesso a un sistema se si consente all'utente di accedere a vio vim. In passato, le persone hanno provato a impostare la shell su un programma speciale che esegue solo determinati comandi. Tuttavia, se uno di questi comandi è vio vim, allora hanno comunque accesso al sistema.
Jonathan Leffler,

Mi dispiace che dato che sono un principiante di questo sito Web, non so come commentare prima questa risposta. Grazie mille per il tuo aiuto. @JonathanLeffler & DavidW.
JQK,

2

La shell predefinita per qualsiasi utente è memorizzata nel file / etc / passwd. L'utente può cambiare la shell predefinita con una qualsiasi delle shell elencate in / etc / shells inviando il chshcomando. Consultare le pagine di manuale di chsh (1) e shells (5) per ulteriori informazioni.

Questa risposta è "più corretta" dell'approccio di sostituzione della shell corrente dopo aver effettuato l'accesso perché non è necessario avviare la shell indesiderata in primo luogo. Questo approccio è utile solo quando l'amministratore ha trascurato il file / etc / shells e ha dimenticato di aggiungere bash (mai).


Ciao , Pax, grazie per la tua risposta. Ma non ho il permesso di eseguire il comando chsh. Anche l'amministratore non vuole usare chsh per cambiare la mia shell. Grazie lo stesso.
JQK,

1

Grazie per tutto il tuo grande aiuto.

Prima di dare la soluzione finale che scelgo, devo evidenziare un errore nella mia domanda originale. Il mio originale .cshrc ha le seguenti tre righe:

     bash
     source ~/.bashrc
     echo $0

Mi sono perso a digitare la seconda riga prima. Scusate.

Ora, ho provato questi due metodi e i risultati sono mostrati di seguito.

1) Metodo .vimrc

Se scrivo

     bash
     source ~/.bashrc
     echo $0

in ~ / .cshrc

e

     set shell=/bin/bash

in ~ / .vimrc

senza alcun file ~ / .login, quindi vim e:! g ++ è OK, ma:! gdb a.out ha qualche errore. Inoltre, "echo $ 0" dà "bash" ma "echo $ SHELL" dà "/ bin / tcsh". Non conosco esattamente la differenza tra $ 0 e $ SHELL.

2) Metodo .login

Se scrivo

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

in .login

ma né qualcosa come "set shell = ..." in ~ / .vimrc né "bash ..." in ~ / .cshrc, tutto è OK. Ora, "echo $ 0" dà "bash" e "echo $ SHELL" dà "/ bin / bash".

Il bash nella seconda riga può essere sostituito da "bash -l". Va notato che se lo sostituisco con "exec bash" o "exec bash -l", non sarò in grado di accedere al mio account. (Il sistema si chiude automaticamente rapidamente.) Neanche io so perché.

Penso che il secondo metodo sia eccezionale. Apprezzo molto il tuo aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.