web-dev-qa-db-ja.com

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

当社はRedHat 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はありません。再びvimHello_World.cppを実行すると、このcppファイルが開いていることがわかります。

ただし、フォルダ内のcppファイルをg ++し、vimと:!を使用しない場合は、すべて問題ありません。実際には、 :!今はvimにとって違法のようです。

オリジナルのtcshを使えば、すべてOKです。

この奇妙なエラーをどのように修正できますか?

よろしくお願いします。

ところで:tcshにもhistdup設定がありますが、主にHISTIGNOREとHISTCONTROLの利便性のために、tcshよりもbashの方が好きです。

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

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

8
JQK

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

setenv Shell /bin/bash
exec bash -l

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

8

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

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

多大なるご協力をありがとうございました。

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

     bash
     source ~/.bashrc
     echo $0

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

さて、この2つの方法を試してみましたが、結果を以下に示します。

1).vimrcメソッド

私が書いたら

     bash
     source ~/.bashrc
     echo $0

〜/ .cshrcで

そして

     set Shell=/bin/bash

〜/ .vimrcで

〜/ .loginファイルがなくても、vimと:!g ++は問題ありませんが、:!gdba.outには誤りがあります。さらに、「echo $ 0」は「bash」を提供しますが、「echo $ Shell」は「/ bin/tcsh」を提供します。 $ 0と$ Shellの違いは正確にはわかりません。

2)。ログイン方法

私が書いたら

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

.loginで

しかし、〜/ .vimrcの「setShell = ...」や〜/ .cshrcの「bash ...」のようなものは何もありません。すべて問題ありません。ここで、「echo $ 0」は「bash」を提供し、「echo $ Shell」は「/ bin/bash」を提供します。

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

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

1
JQK