vim无法使用:!执行unix命令!由于换壳


8

我们公司使用Red Hat Linux系统,并在/ home中为每个人分配一个帐户。不幸的是,我们的系统正在使用tsch,这对我不利。而且,由于我没有超级用户权限,因此无法使用chsh命令自己更改为bash。更糟糕的是,ypchsh对我也不可用。因此,最后,我在.cshrc中添加了以下几行:

    bash
    echo $0

并适当配置.bashrc(从原始.cshrc复制并修复必要的语法错误)。现在,明显的shell变成了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文件已打开。

但是,如果我g ++文件夹中的cpp文件但不使用vim和:!,一切正常。事实上, :!现在看来对于vim是非法的。

如果我使用原始的tcsh,一切都还可以。

我该如何解决这个奇怪的错误?

谢谢您的提前帮助。

顺便说一句:我喜欢bash而不是tcsh,这主要是因为它具有HISTIGNORE和HISTCONTROL的便利性,尽管tcsh也具有histdup设置。

我发现以下内容对我的问题有所帮助,但仍然不令人满意。

如何在Vim中运行Unix命令?


使用chsh更改登录shell。
ЯрославРахматуллин

Answers:


8

将其放在您的.login脚本中:

setenv SHELL /bin/bash
exec bash -l

第一行设置SHELL环境变量。第二行替换tcshbash,但告诉它作为登录shell中运行(这样bash会处理您的.profile等等)。您可以添加一个-i选项使其互动。它没有必要。


2
您也可以将其set shell=/bin/bash放在VIM中。这样,您可以保留外壳,但可以在VIM中使用BASH并避免出现!问题。但是,我发现OP无论如何都喜欢bash,因此您的解决方案不仅可以解决VIM问题,还可以为OP提供首选的shell。
David W.

你是对的,@ DavidW。由于任何人都可以将shell设置为vim(或vi)任意值,因此,如果允许用户访问vi或,则基本上不可能限制对系统的访问vim。过去,人们尝试将Shell设置为仅执行某些命令的特殊程序。但是,如果这些命令之一是vivim,则它们仍然可以访问系统。
乔纳森·勒夫勒

我很抱歉,因为我是该网站的新手,所以我之前不知道如何对此答案发表评论。非常感谢您的帮助。@JonathanLeffler和DavidW。
JQK 2012年

2

任何用户的默认外壳程序都存储在/ etc / passwd文件中。用户可以通过发出chsh命令将其默认shell更改为/ etc / shells中列出的任何shell 。有关更多信息,请参考chsh(1)和shells(5)的手册页。

该答案比登录后替换当前外壳程序的方法“更正确”,因为不必首先启动不需要的外壳程序。仅当管理员忽略了/ etc / shells文件并忘记向其添加bash(从不)时,该方法才有用。


您好,Pax,谢谢您的答复。但是我没有执行chsh命令的权限。管理员也不想使用chsh更改我的shell。谢谢你们
JQK 2012年

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”代替它,那么我将无法登录我的帐户。(系统自动快速退出。)我也不知道为什么。

我认为第二种方法很棒。非常感谢您的帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.