由于 shell 更改,vim 无法使用 :! 执行 unix 命令

由于 shell 更改,vim 无法使用 :! 执行 unix 命令

我们公司使用的是 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 命令?

答案1

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

setenv SHELL /bin/bash
exec bash -l

第一行设置 SHELL 环境变量。第二行将 替换为tcshbash但告诉它作为登录 shell 运行(因此bash将处理您的.profile等)。您可以添加一个-i选项使其具有交互性;这不是必要的。

答案2

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

这个答案比登录后替换当前 shell 的方法“更正确”,因为首先没有必要启动不需要的 shell。该方法仅在管理员忽略了 /etc/shells 文件并忘记将 bash 添加到其中时才有用(永远不会)。

答案3

感谢您的大力帮助。

在给出我最终选择的解决方案之前,我必须指出我原始问题中的一个错误。我原来的.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).login方法

如果我写

     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”代替的话,那么我就登录不上账号了(系统很快就自动退出了),我也不知道为什么。

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

相关内容