vim kann Unix-Befehle nicht ausführen mit :! aufgrund von Schalenwechsel

8

Unser Unternehmen verwendet das Red Hat Linux-System und weist jedem ein Konto in / home zu. Leider verwendet unser System tsch, was für mich nicht günstig ist. Da ich nicht über die Superuser-Berechtigung verfüge, kann ich den Befehl chsh nicht verwenden, um für mich selbst zu bash zu wechseln. Schlimmer noch, ypchsh ist auch für mich nicht verfügbar. Also füge ich endlich die folgenden Zeilen in die .cshrc ein:

    bash
    echo $0

und konfigurieren Sie die .bashrc entsprechend (Kopieren von der ursprünglichen .cshrc und Beheben des erforderlichen Syntaxfehlers). Jetzt wird die scheinbare Shell zu Bash (wie aus dem Befehl "echo $ 0" hervorgeht).

Jetzt taucht das Problem auf:

Wenn ich eine cpp-Datei mit vim bearbeite (z. B. Hello_World) und in vim ":! G ++ -g Hello_World.cpp -o hw.out" verwende, um die Datei zu kompilieren, wird kein Ergebnis angezeigt und vim wird mit beendet "bash" wird angezeigt (wie wenn ein Terminal geöffnet ist), aber ohne das übliche "Drücken einer Taste", um zu meiner Arbeit in vim zurückzukehren. Im Ordner Hello_World.cpp befindet sich eine .Hello_World.cpp.swp-Datei, jedoch nicht hw.out. Wenn vim Hello_World.cpp erneut angezeigt wird, stellt sich heraus, dass diese CPP-Datei geöffnet wurde.

Wenn ich jedoch die cpp-Datei im Ordner g ++, aber nicht vim und:! Verwende, ist alles in Ordnung. Eigentlich, :! jetzt scheint für vim illegal zu sein.

Wenn ich das Original tcsh verwende, ist auch alles in Ordnung.

Wie könnte ich diesen merkwürdigen Fehler beheben?

Vielen Dank für Ihre freundliche Hilfe im Voraus.

Qing

Übrigens: Ich bevorzuge bash gegenüber tcsh, hauptsächlich wegen der Bequemlichkeit von HISTIGNORE und HISTCONTROL, obwohl tcsh auch eine Histdup-Einstellung hat.

Ich fand das Folgende ein wenig hilfreich, aber für mein Problem immer noch nicht zufriedenstellend.

Wie führe ich Unix-Befehle in Vim aus?

JQK
quelle
Verwenden chshSie diese Option, um Ihre Login-Shell zu ändern.
Ярослав Рахматуллин

Antworten:

8

Fügen Sie dies in Ihr .login-Skript ein:

setenv SHELL /bin/bash
exec bash -l

In der ersten Zeile wird die Umgebungsvariable SHELL festgelegt. Die zweite Zeile ersetzt die tcshmit bash, weist sie jedoch an, als Anmeldeshell ausgeführt zu werden (so bashwird Ihre .profileusw. verarbeitet). Sie können eine -iOption hinzufügen , um sie interaktiv zu gestalten. es sollte nicht notwendig sein.

Jonathan Leffler
quelle
2
Sie können auch set shell=/bin/bashin VIM einfügen. Auf diese Weise können Sie Ihre Shell behalten, aber BASH in VIM verwenden und die !Probleme vermeiden . Ich sehe jedoch, dass OP ohnehin Bash bevorzugt, sodass Ihre Lösung nicht nur das VIM-Problem löst, sondern OP auch die bevorzugte Shell gibt.
David W.
Du hast recht, @DavidW. Da jeder seine Shell in vim(oder vi) beliebig einstellen kann , ist es grundsätzlich unmöglich, den Zugriff auf ein System einzuschränken, wenn Sie dem Benutzer Zugriff auf vioder gewähren vim. In der Vergangenheit haben Leute versucht, die Shell auf ein spezielles Programm einzustellen, das nur bestimmte Befehle ausführt. Wenn jedoch einer dieser Befehle vioder ist vim, haben sie trotzdem Zugriff auf das System.
Jonathan Leffler
Es tut mir leid, dass ich als Neuling auf dieser Website nicht weiß, wie ich diese Antwort vorher kommentieren soll. Vielen Dank für Ihre Hilfe. @ JonathanLeffler & DavidW.
JQK
2

Die Standard-Shell für jeden Benutzer wird in der Datei / etc / passwd gespeichert. Der Benutzer kann seine Standard-Shell durch Ausgabe des chshBefehls in eine der in / etc / shells aufgelisteten Shells ändern . Weitere Informationen finden Sie in den Handbuchseiten von chsh (1) und shells (5).

Diese Antwort ist "korrekter" als der Ansatz, die aktuelle Shell nach dem Anmelden zu ersetzen, da es nicht erforderlich ist, die unerwünschte Shell zuerst zu starten. Dieser Ansatz ist nur dann nützlich, wenn der Administrator die Datei / etc / shells vernachlässigt und vergessen hat, Bash hinzuzufügen (niemals).

Ярослав Рахматуллин
quelle
Hallo ax Pax, danke für deine Antwort. Ich habe jedoch nicht die Berechtigung, den Befehl chsh auszuführen. Der Administrator möchte chsh auch nicht zum Ändern meiner Shell verwenden. Trotzdem danke.
JQK
1

Vielen Dank für all Ihre großartige Hilfe.

Bevor ich die endgültige Lösung gebe, die ich wähle, muss ich auf einen Fehler in meiner ursprünglichen Frage hinweisen. Meine ursprüngliche .cshrc hat die folgenden drei Zeilen:

     bash
     source ~/.bashrc
     echo $0

Ich habe vorher die zweite Zeile verpasst. Es tut uns leid.

Jetzt habe ich diese beiden Methoden ausprobiert und die Ergebnisse sind unten gezeigt.

1) .vimrc-Methode

Wenn ich schreibe

     bash
     source ~/.bashrc
     echo $0

in ~ / .cshrc

und

     set shell=/bin/bash

in ~ / .vimrc

Ohne ~ / .login-Datei ist vim und :! g ++ in Ordnung, aber :! gdb a.out hat einen Fehler. Außerdem gibt "echo $ 0" "bash", "echo $ SHELL" jedoch "/ bin / tcsh". Ich kenne den Unterschied zwischen $ 0 und $ SHELL nicht genau.

2) Anmeldemethode

Wenn ich schreibe

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

in .login

aber weder etwas wie "set shell = ..." in ~ / .vimrc noch "bash ..." in ~ / .cshrc, alles ist in Ordnung. Jetzt gibt "echo $ 0" "bash" und "echo $ SHELL" "/ bin / bash".

Der Bash in der zweiten Zeile kann durch "bash -l" ersetzt werden. Es sollte beachtet werden, dass ich mich nicht in meinem Konto anmelden kann, wenn ich es durch "exec bash" oder "exec bash -l" ersetze. (Das System wird automatisch schnell beendet.) Ich weiß auch nicht warum.

Ich finde die zweite Methode großartig. Ich schätze Ihre Hilfe sehr.

JQK
quelle