我们公司使用的是 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 设置。
我发现以下内容有点帮助但仍然不能令人满意地解决我的问题。
答案1
将其放入您的 .login 脚本中:
setenv SHELL /bin/bash
exec bash -l
第一行设置 SHELL 环境变量。第二行将 替换为tcsh
,bash
但告诉它作为登录 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”代替的话,那么我就登录不上账号了(系统很快就自动退出了),我也不知道为什么。
我认为第二种方法很好。非常感谢您的帮助。