vim nie może wykonać komendy unix z:! z powodu zmiany powłoki

8

Nasza firma korzysta z systemu red hat linux i przydziela każdemu konto w / home. Niestety nasz system używa tsch, co nie jest dla mnie korzystne. Co więcej, ponieważ nie mam uprawnień superużytkownika, nie mogę użyć polecenia chsh, aby zmienić się na bash. Co gorsza, ypchsh jest również dla mnie niedostępny. Wreszcie dodałem następujące wiersze do pliku .cshrc:

    bash
    echo $0

i odpowiednio skonfiguruj .bashrc (kopiowanie z oryginalnego .cshrc i naprawienie niezbędnego błędu składniowego). Teraz widoczna powłoka staje się bash (jak można to zobaczyć po poleceniu „echo $ 0”).

Teraz pojawia się problem:

Kiedy używam vima do edycji pliku cpp (np. Hello_World) i używam „:! G ++ -g Hello_World.cpp -o hw.out” w vimie do skompilowania pliku, żaden wynik nie zostanie wyświetlony, a vim zostanie zakończony z Pokazano „bash” (jak gdy terminal jest otwarty), ale bez zwykłego „wciśnięcia klawisza”, aby wrócić do mojej pracy w vimie. W folderze Hello_World.cpp znajduje się plik .Hello_World.cpp.swp, ale nie hw.out. Gdy vim Hello_World.cpp ponownie, okazuje się, że ten plik CPP został otwarty.

Jeśli jednak g ++ plik cpp w folderze, ale nie używam vim i:!, Wszystko jest w porządku. W rzeczywistości, :! teraz wydaje się być nielegalny dla vima.

Jeśli użyję oryginalnego tcsh, wszystko też będzie OK.

Jak mogę naprawić ten ciekawy błąd?

Z góry dziękuję za życzliwą pomoc.

qing

BTW: Wolę bash niż tcsh przede wszystkim ze względu na wygodę HISTIGNORE i HISTCONTROL, chociaż tcsh ma również ustawienia histdup.

Uważam, że poniższe informacje są trochę pomocne, ale nadal niezadowalające dla mojego problemu.

Jak uruchamiać polecenia Uniksa z poziomu Vima?

JQK
źródło
Służy chshdo zmiany powłoki logowania.
Ярослав Рахматуллин

Odpowiedzi:

8

Umieść to w swoim skrypcie .login:

setenv SHELL /bin/bash
exec bash -l

Pierwszy wiersz ustawia zmienną środowiskową SHELL. Druga linia zastępuje tcshz bash, ale mówi mu, by działał jako powłokę logowania (tak bashprzetwarza .profileetc). Możesz dodać -iopcję, aby uczynić go interaktywnym; nie powinno to być konieczne.

Jonathan Leffler
źródło
2
Możesz także umieścić set shell=/bin/bashw VIM. W ten sposób możesz zachować swoją powłokę, ale użyj BASH w VIM i unikaj !problemów. Widzę jednak, że OP i tak preferuje bash, więc twoje rozwiązanie nie tylko rozwiąże problem VIM, ale da OP preferowaną powłokę.
David W.
Masz rację, @DavidW. Ponieważ każdy może ustawić swoją powłokę w vim(lub vi) na cokolwiek zechce , w zasadzie niemożliwe jest ograniczenie dostępu do systemu, jeśli zezwolisz użytkownikowi na dostęp do vilub vim. W przeszłości ludzie próbowali ustawić powłokę na specjalny program, który wykonuje tylko niektóre polecenia. Jeśli jednak jednym z tych poleceń jest vilub vim, mają mimo to dostęp do systemu.
Jonathan Leffler
Przykro mi, że jako nowy użytkownik tej witryny nie wiem, jak wcześniej skomentować tę odpowiedź. Bardzo ci dziękuje za pomoc. @JonathanLeffler & DavidW.
JQK,
2

Domyślna powłoka dla każdego użytkownika jest przechowywana w pliku / etc / passwd. Użytkownik może zmienić domyślną powłokę na dowolną z powłok wymienionych w / etc / shells, wydając chshpolecenie. Więcej informacji można znaleźć na stronach podręcznika chsh (1) i powłok (5).

Ta odpowiedź jest „bardziej poprawna” niż podejście polegające na zastąpieniu bieżącej powłoki po zalogowaniu, ponieważ w pierwszej kolejności nie jest konieczne uruchamianie niepożądanej powłoki. Takie podejście jest użyteczne tylko wtedy, gdy administrator zaniedbał plik / etc / shells i zapomniał dodać do niego bash (nigdy).

Ярослав Рахматуллин
źródło
Cześć Pax, dziękuję za odpowiedź. Ale nie mam uprawnień do wykonania polecenia chsh. Administrator nie chce też używać chsh do zmiany mojej powłoki. Dziękuję wszystkim tym samym.
JQK,
1

Dziękuję za twoją wielką pomoc.

Przed podaniem ostatecznego rozwiązania, które wybiorę, muszę wskazać błąd w moim pierwotnym pytaniu. Mój oryginalny plik .cshrc ma następujące trzy wiersze:

     bash
     source ~/.bashrc
     echo $0

Wcześniej tęskniłem za wpisaniem drugiej linii. Przepraszam.

Teraz wypróbowałem te dwie metody, a wyniki pokazano poniżej.

1) metoda .vimrc

Jeśli napiszę

     bash
     source ~/.bashrc
     echo $0

w ~ / .cshrc

i

     set shell=/bin/bash

w ~ / .vimrc

bez żadnego pliku ~ / .login, a następnie vim i:! g ++ jest OK, ale:! gdb a.out ma jakiś błąd. Ponadto „echo $ 0” daje „bash”, ale „echo $ SHELL” daje „/ bin / tcsh”. Nie znam dokładnie różnicy między 0 $ a SHELL.

2) metoda logowania

Jeśli napiszę

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

w .login

ale ani nic takiego jak „set shell = ...” w ~ / .vimrc ani „bash ...” w ~ / .cshrc, wszystko jest w porządku. Teraz „echo $ 0” daje „bash”, a „echo $ SHELL” daje „/ bin / bash”.

Bash w drugiej linii można zastąpić „bash -l”. Należy zauważyć, że jeśli zastąpię go słowem „exec bash” lub „exec bash -l”, nie będę mógł zalogować się na swoje konto. (System automatycznie kończy pracę.) Ja też nie wiem dlaczego.

Myślę, że druga metoda jest świetna. Bardzo doceniam twoją pomoc.

JQK
źródło