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

Ame*_*ina 9 shell login zsh exec

我在这个线程中看到了以下片段:How to change from csh to bash as default shell

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

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

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

有了这个:

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

Gil*_*il' 6

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

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

现在,如果您的登录 shell 不是 csh,您将需要一个不同的exec. 在 Bourne 风格的 shell 中,包括 zsh:

if [ -x ~/bin/zsh ]; then exec ~/bin/zsh; fi
Run Code Online (Sandbox Code Playgroud)

作出这样的exec ~/bin/zsh -l,如果你想的zsh的新实例来阅读你的~/.zprofile。请注意,如果您这样做,上面的代码段必须在您的.profile或.bash_profile;如果你的登录shell是zsh的,不要把片段放在你的.zprofile,要么做十分肯定的zsh的新实例不会调用exec一次。