vim은 다음으로 유닉스 명령을 실행할 수 없습니다 :! 쉘 교체로 인해


8

우리 회사는 Red Hat Linux 시스템을 사용하고 / home에 모든 사람에게 계정을 할당합니다. 불행히도 우리 시스템은 tsch를 사용하고 있습니다. 또한 슈퍼 사용자 권한이 없으므로 chsh 명령을 사용하여 bash로 변경할 수 없습니다. 더 나쁜 것은, ypchsh도 사용할 수 없습니다. 마지막으로 .cshrc에 다음 줄을 추가합니다.

    bash
    echo $0

.bashrc를 적절하게 구성하십시오 (원본 .cshrc에서 복사하고 필요한 구문 오류 수정). 이제 "echo $ 0"명령에서 볼 수 있듯이 명백한 쉘은 bash가됩니다.

이제 문제가 발생합니다.

vim을 사용하여 cpp 파일 (예 : Hello_World)을 편집하고 vim에서 ":! g ++ -g Hello_World.cpp -o hw.out"을 사용하여 파일을 컴파일하면 결과가 표시되지 않고 vim이 종료됩니다. "bash"(터미널이 열려있을 때와 같이)가 표시되지만, 일반적인 "키를 누르지 않고"vim에서 내 작업으로 돌아갑니다. Hello_World.cpp 폴더에는 .Hello_World.cpp.swp 파일이 있지만 hw.out은 없습니다. vim Hello_World.cpp를 다시 누르면이 cpp 파일이 열린 것으로 나타납니다.

그러나 폴더에 cpp 파일을 g ++ 있지만 vim 및 :!를 사용하지 않으면 모든 것이 정상입니다. 사실로, :! 지금은 vim에게는 불법 인 것 같습니다.

원래 tcsh를 사용하면 모든 것이 정상입니다.

이 궁금한 오류를 어떻게 해결할 수 있습니까?

미리 도와 주셔서 감사합니다.

BTW : tcsh에는 histdup 설정이 있지만 HISTIGNORE 및 HISTCONTROL의 편의성 때문에 주로 tcsh보다 bash를 선호합니다.

다음은 약간 도움이되었지만 여전히 내 문제에는 만족스럽지 않습니다.

Vim에서 유닉스 명령을 실행하는 방법은 무엇입니까?


chsh로그인 쉘을 변경하는 데 사용하십시오 .
Ярослав Рахматуллин

답변:


8

이것을 .login 스크립트에 넣으십시오.

setenv SHELL /bin/bash
exec bash -l

첫 번째 줄은 SHELL 환경 변수를 설정합니다. 두 번째 줄은 대체 tcshbash하지만 (그래서 로그인 쉘로 실행하도록 지시 bash처리됩니다 .profile등). -i대화식으로 만드는 옵션을 추가 할 수 있습니다 . 필요하지 않아야합니다.


2
set shell=/bin/bashVIM 안에 넣을 수도 있습니다 . 그렇게하면 쉘을 유지할 수는 있지만 VIM에서 BASH를 사용하고 !문제를 피할 수 있습니다. 그러나 OP는 어쨌든 bash를 선호하므로 솔루션이 VIM 문제를 해결할뿐만 아니라 OP에 선호하는 셸을 제공합니다.
David W.

당신이 맞습니다, @DavidW. 사람이 자신의 쉘 설정할 수 있기 때문에 vim(또는 vi그들이 원하는대로에)을, 당신이에 대한 사용자 액세스를 허용하는 경우 시스템에 대한 액세스를 제한하기 위해 기본적으로 불가능하다 vivim. 과거에는 사람들이 특정 명령 만 실행하는 특수 프로그램으로 셸을 설정하려고 시도했습니다. 그러나 해당 명령 중 하나가 vi또는 vim인 경우 어쨌든 시스템에 액세스 할 수 있습니다.
Jonathan Leffler

이 웹 사이트를 처음 접할 때이 답변에 대해 어떻게 의견을 말해야할지 모르겠습니다. 당신의 도움을 주셔서 대단히 감사합니다. @JonathanLeffler & DavidW.
JQK

2

모든 사용자의 기본 쉘은 / etc / passwd 파일에 저장됩니다. 사용자는 chsh명령 을 실행하여 기본 쉘을 / etc / shells에 나열된 쉘로 변경할 수 있습니다 . 자세한 내용은 chsh (1) 및 셸 (5)의 매뉴얼 페이지를 참조하십시오.

이 답변은 로그인 후 현재 쉘을 교체하는 방법보다 "보다 정확합니다."원하지 않는 쉘을 먼저 시작할 필요가 없기 때문입니다. 이 방법은 관리자가 / etc / shells 파일을 무시하고 bash를 추가하지 않은 경우에만 유용합니다.


안녕하세요, Pax, 답장을 보내 주셔서 감사합니다. 그러나 chsh 명령을 실행할 권한이 없습니다. 관리자는 chsh를 사용하여 쉘을 변경하고 싶지 않습니다. 모두 감사합니다.
JQK

1

큰 도움을 주셔서 감사합니다.

선택한 최종 솔루션을 제공하기 전에 원래 질문에서 실수를 지적해야합니다. 내 원본 .cshrc에는 다음 세 줄이 있습니다.

     bash
     source ~/.bashrc
     echo $0

전에 두 번째 줄을 입력하지 못했습니다. 죄송합니다.

이제이 두 가지 방법을 시도했으며 결과가 아래에 나와 있습니다.

1) .vimrc 방법

내가 쓰면

     bash
     source ~/.bashrc
     echo $0

~ / .cshrc

     set shell=/bin/bash

~ / .vimrc

~ / .login 파일이 없으면 vim과 :! g ++는 정상이지만 :! gdb a.out에는 실수가 있습니다. 또한 "echo $ 0"은 "bash"를 제공하지만 "echo $ SHELL"은 "/ bin / tcsh"를 제공합니다. 나는 $ 0과 $ SHELL의 차이점을 정확히 모른다.

2). 로그인 방법

내가 쓰면

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

.login에서

~ / .vimrc의 "set shell = ..."이나 ~ / .cshrc의 "bash ..."와 같은 것은 없습니다. 이제 "echo $ 0"은 "bash"를 제공하고 "echo $ SHELL"은 "/ bin / bash"를 제공합니다.

두 번째 줄의 bash는 "bash -l"로 바꿀 수 있습니다. "exec bash"또는 "exec bash -l"로 바꾸면 내 계정에 로그인 할 수 없습니다. (시스템이 자동으로 빨리 종료됩니다.) 이유도 모르겠습니다.

두 번째 방법이 훌륭하다고 생각합니다. 도와 주셔서 감사합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.