vim ne peut pas exécuter la commande unix avec:! en raison du changement de coque

8

Notre entreprise utilise le système Red Hat Linux et alloue à chacun un compte dans / home. Malheureusement, notre système utilise tsch, ce qui n'est pas favorable pour moi. De plus, comme je n'ai pas l'autorisation de super utilisateur, je ne peux pas utiliser la commande chsh pour changer pour bash pour moi. Pire encore, ypchsh est également indisponible pour moi. Donc, enfin, j'ajoute les lignes suivantes dans le .cshrc:

    bash
    echo $0

et configurez le .bashrc de manière appropriée (copie à partir du .cshrc d'origine et correction de l'erreur de syntaxe nécessaire). Maintenant, le shell apparent devient bash (comme le montre la commande "echo $ 0").

Maintenant, le problème se pose:

Lorsque j'utilise vim pour éditer un fichier cpp (par exemple, Hello_World) et que j'utilise ":! G ++ -g Hello_World.cpp -o hw.out" dans vim pour compiler le fichier, aucun résultat ne sera affiché et vim est quitté avec "bash" affiché (comme quand un terminal est ouvert), mais sans l'habituel "appuyez sur une touche" pour revenir à mon travail dans vim. Dans le dossier Hello_World.cpp, il y a un fichier .Hello_World.cpp.swp, mais pas hw.out. Lorsque vim Hello_World.cpp recommence, il s'avère que ce fichier cpp a été ouvert.

Cependant, si je g ++ le fichier cpp dans le dossier mais n'utilise pas vim et:!, Tout va bien. En réalité, :! semble désormais illégal pour vim.

Si j'utilise le tcsh d'origine, tout est également OK.

Comment pourrais-je corriger cette curieuse erreur?

Merci pour votre aimable aide à l'avance.

qing

BTW: Je préfère bash à tcsh principalement en raison de la commodité de HISTIGNORE et HISTCONTROL, bien que tcsh ait également un paramètre histdup.

J'ai trouvé ce qui suit un peu utile mais toujours pas satisfaisant pour mon problème.

Comment exécuter les commandes Unix depuis Vim?

JQK
la source
Utilisez chshpour changer votre shell de connexion.
Ярослав Рахматуллин

Réponses:

8

Mettez ceci dans votre script .login:

setenv SHELL /bin/bash
exec bash -l

La première ligne définit la variable d'environnement SHELL. La deuxième ligne remplace le tcshwith bash, mais lui dit de s'exécuter comme un shell de connexion (ainsi bashtraitera votre .profileetc). Vous pouvez ajouter une -ioption pour la rendre interactive; cela ne devrait pas être nécessaire.

Jonathan Leffler
la source
2
Vous pouvez également mettre à l' set shell=/bin/bashintérieur de VIM. De cette façon, vous pouvez conserver votre shell, mais utilisez BASH dans VIM et évitez les !problèmes. Cependant, je vois que OP préfère de toute façon bash, donc votre solution résoudra non seulement le problème VIM, mais donnera à OP son shell préféré.
David
Vous avez raison, @DavidW. Étant donné que n'importe qui peut définir son shell dans vim(ou vi) comme bon lui semble, il est fondamentalement impossible de restreindre l'accès à un système si vous autorisez l'utilisateur à accéder à viou vim. Dans le passé, les gens ont essayé de définir le shell sur un programme spécial qui n'exécute que certaines commandes. Cependant, si l'une de ces commandes est viou vim, elles ont quand même accès au système.
Jonathan Leffler
Je suis désolé car, étant novice sur ce site, je ne sais pas comment commenter cette réponse auparavant. Merci beaucoup pour votre aide. @JonathanLeffler & DavidW.
JQK
2

Le shell par défaut pour tout utilisateur est stocké dans le fichier / etc / passwd. L'utilisateur peut changer son shell par défaut en n'importe lequel des shells répertoriés dans / etc / shells en exécutant la chshcommande. Consultez les pages de manuel de chsh (1) et shells (5) pour plus d'informations.

Cette réponse est "plus correcte" que l'approche consistant à remplacer le shell actuel après la connexion, car il n'est pas nécessaire de démarrer le shell indésirable en premier lieu. Cette approche n'est utile que lorsque l'administrateur a négligé le fichier / etc / shells et oublié d'y ajouter bash (jamais).

Ярослав Рахматуллин
la source
Salut , Pax, merci pour ta réponse. Mais je n'ai pas la permission d'exécuter la commande chsh. L'administrateur ne veut pas non plus utiliser chsh pour changer mon shell. Merci tout de même.
JQK
1

Merci pour toute votre grande aide.

Avant de donner la solution finale que je choisis, je dois signaler une erreur dans ma question initiale. Mon .cshrc d'origine a les trois lignes suivantes:

     bash
     source ~/.bashrc
     echo $0

J'ai manqué de taper la deuxième ligne avant. Désolé.

Maintenant, j'ai essayé ces deux méthodes, et les résultats sont présentés ci-dessous.

1) Méthode .vimrc

Si j'écris

     bash
     source ~/.bashrc
     echo $0

dans ~ / .cshrc

et

     set shell=/bin/bash

dans ~ / .vimrc

sans aucun fichier ~ / .login, alors vim et:! g ++ est OK, mais:! gdb a.out a une erreur. De plus, "echo $ 0" donne "bash" mais "echo $ SHELL" donne "/ bin / tcsh". Je ne connais pas exactement la différence entre 0 $ et $ SHELL.

2) Méthode .login

Si j'écris

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

dans .login

mais ni quelque chose comme "set shell = ..." dans ~ / .vimrc ni "bash ..." dans ~ / .cshrc, tout va bien. Maintenant, "echo $ 0" donne "bash" et "echo $ SHELL" donne "/ bin / bash".

Le bash en deuxième ligne peut être remplacé par "bash -l". Il convient de noter que si je le remplace par "exec bash" ou "exec bash -l", je ne pourrai pas me connecter à mon compte. (Le système se ferme automatiquement rapidement.) Je ne sais pas non plus pourquoi.

Je pense que la deuxième méthode est excellente. J'apprécie beaucoup votre aide.

JQK
la source