vimは:!でunixコマンドを実行できません。シェルの変更により


8

私たちの会社はRed Hat Linuxシステムを使用し、すべてのユーザーに/ homeのアカウントを割り当てています。残念ながら、私たちのシステムはtschを使用していますが、これは私には好ましくありません。また、スーパーユーザー権限がないため、chshコマンドを使用して自分でbashに変更することはできません。さらに悪いことに、ypchshも利用できません。そこで、最後に、次の行を.cshrcに追加します。

    bash
    echo $0

.bashrcを適切に構成します(元の.cshrcからコピーし、必要な構文エラーを修正します)。これで、見かけ上のシェルがbashになります( "echo $ 0"コマンドで確認できます)。

今問題が出てきます:

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を使用すれば、何も問題はありません。

この奇妙なエラーを修正するにはどうすればよいですか?

よろしくお願いします。

ところで、tcshにはhistdup設定もありますが、主にHISTIGNOREとHISTCONTROLの便利さから、tcshよりもbashを好みます。

以下は少し役に立ちましたが、私の問題にはまだ満足できません。

Vim内からUnixコマンドを実行する方法は?


chshログインシェルを変更するために使用します。
ЯрославРахматуллин

回答:


8

これを.loginスクリプトに入れます。

setenv SHELL /bin/bash
exec bash -l

1行目は、SHELL環境変数を設定します。2行目では、tcshbashに置き換えていますが、ログインシェルとして実行するように指示しています(そのためbash.profileetc を処理します)。-iインタラクティブにするオプションを追加できます。必要ないはずです。


2
set shell=/bin/bashVIMの中に置くこともできます。そうすれば、シェルを維持できますが、VIMでBASHを使用して!問題を回避できます。ただし、OPはとにかくbashを好むので、ソリューションはVIMの問題を解決するだけでなく、OPに優先シェルを提供します。
David W.

その通りです、@ DavidW。誰でもvim(またはvi)のシェルを好きなように設定できるため、ユーザーにviまたはへのアクセスを許可した場合、システムへのアクセスを制限することは基本的に不可能vimです。昔は、特定のコマンドのみを実行する特別なプログラムにシェルを設定しようとしていました。ただし、これらのコマンドのviいずれかがまたはである場合はvim、いずれにしてもシステムにアクセスできます。
ジョナサンレフラー

私はこのウェブサイトの初心者なので、以前にこの回答にコメントする方法がわかりません。手伝ってくれてありがとうございます。@JonathanLeffler&DavidW。
JQK

2

すべてのユーザーのデフォルトのシェルは、/ etc / passwdファイルに格納されています。ユーザーは、chshコマンドを発行することにより、デフォルトのシェルを/ etc / shellsにリストされている任意のシェルに変更できます。詳細については、chsh(1)およびshells(5)のマニュアルページを参照してください。

この答えは、最初に不要なシェルを起動する必要がないため、ログイン後に現在のシェルを置き換える方法よりも「より正確」です。この方法が役立つのは、管理者が/ etc / shellsファイルを無視し、bashを追加するのを忘れた場合のみです(決して)。


こんにちは、パックス、返信ありがとうございます。しかし、chshコマンドを実行する権限がありません。管理者も、chshを使用してシェルを変更したくありません。どうもありがとうございました。
JQK

1

たくさんのご協力ありがとうございます。

私が選択する最終的な解決策を与える前に、元の質問の誤りを指摘しなければなりません。私の元の.cshrcには次の3行があります。

     bash
     source ~/.bashrc
     echo $0

前に2行目を入力し忘れました。ごめんなさい。

今、私はこれら二つの方法を試しました、そして結果は以下に示されます。

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).loginメソッド

私が書いたら

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

.login

〜/ .vimrcの "set shell = ..."や〜/ .cshrcの "bash ..."のようなものは一切なく、すべて問題ありません。現在、「echo $ 0」は「bash」を提供し、「echo $ SHELL」は「/ bin / bash」を提供します。

2行目のbashは、「bash -l」で置き換えることができます。「exec bash」または「exec bash -l」に置き換えると、アカウントにログインできなくなります。(システムは自動的にすぐに終了します。)理由もわかりません。

2番目の方法は素晴らしいと思います。どうぞよろしくお願いいたします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.