在没有chsh或管理员特权的情况下更改默认Shell


8

我在该线程中看到了以下代码片段:如何将csh更改为bash作为默认shell

sleep 2
if (-x /usr/local/bin/bash) then
  exec /bin/sh -c '. ~/.profile; exec /usr/local/bin/bash'
endif

我的理解是,如果您将此代码段放入~/.login其中,则bash在您登录时会调用它。

我遇到类似的情况,我想使用类似的代码段来调用zsh与我登录时所使用的默认代码段不同的代码段。遇到这种麻烦的部分原因是因为我无法选择zsh在中允许的选项中我想要的版本chsh,并且我没有管理员权限。

有了这个:

  • 在不同版本的zsh之间切换时,如何更改上面的代码段来执行此操作?
  • 为什么exec上面的代码片段需要两个命令?他们在做什么?另外,为什么上述代码段使用sh bash(用户应该使用登录csh

Answers:


6

如果要执行zsh而不是bash,只需替换/usr/local/bin/bashzsh可执行文件的路径即可。请注意,此代码段特定于csh。如果您的登录shell不是(t)csh,则此代码~/.login对您无济于事。

至于为什么片段是用这种方式编写的,您必须要问编写它的人。[检查那是谁。]哦。好吧,如果您只是这样做,exec /usr/local/bin/bash那么您将不会启动登录shell,因此您.profile将不会被执行。但这可以通过执行来以更简单的方式解决/usr/local/bin/bash --login

现在,如果您的登录外壳不是csh,则需要使用另一段exec。在Bourne样式的shell中,包括zsh:

if [ -x ~/bin/zsh ]; then exec ~/bin/zsh; fi

作出这样的exec ~/bin/zsh -l,如果你想的zsh的新实例来阅读你的~/.zprofile。请注意,如果执行此操作,则以上代码段必须位于您.profile或中.bash_profile;如果您的登录Shell是zsh,请不要将代码段放入您的中.zprofile,否则请确保不会exec再次调用zsh的新实例。


谢谢@吉尔斯。我在我的.zprofile:上写了以下内容if [[ $ZSH_VERSION != 4.3.14 ]]; then exec /n/sw/zsh-4.3.14/bin/zsh --login fi,这似乎可行!
Amelio Vazquez-Reina
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.