我正在使用学校的计算机,并且想使用zsh
而不是bash
.我想将其设为默认 shell,但我无法运行命令,例如$ chsh -s $(which zsh)
因为我没有管理员权限。
有没有一种方法可以将某些内容放入我的内容或打开时.bashrc
自动调用的内容作为解决方法?zsh
澄清一下,zsh
已经安装了。
答案1
.bash_profile
在您的主目录中创建并添加以下行:
export SHELL=/bin/zsh
exec /bin/zsh -l
更新:.profile
当默认 shell 不是 bash 时,可以作为通用解决方案。我不确定.profile
Zsh 是否也可以调用它,它可能会变得多余,但我们可以通过简单的检查来安全地完成它:
export SHELL=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l
我们还可以使用来获取依赖于 的值的which
动态路径:zsh
$PATH
export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l
答案2
通常您可以chsh
作为非 root 用户使用。但它偶尔会被禁用,通常是在使用某种形式的网络用户数据库(如 NIS 和 LDAP)的站点中。可能有ypchsh
(NIS) 或chsh.ldap
(LDAP)。
chsh
通常也只会允许一些得到正式认可的shell,通常是 中列出的 shell /etc/shells
。
如果您无法chsh
在站点上使用或其变体,请将您的登录 shell 安排到exec
您最喜欢的 shell,并将SHELL
变量设置为指向您最喜欢的 shell。
如果您的登录 shell 是
sh
,dash
或者ksh
:您需要编辑的文件是~/.profile
.请注意,该文件是在交互式会话开始时以及某些非交互式会话启动脚本(例如,对于 X11 会话)读取的,因此您需要注意:仅exec
在当前进程时调用(替换当前进程) shell 是交互式的。除了 Bourne shell(Solaris 10 及之前的版本)之外,您可以通过选项列表 ( ) 中/bin/sh
的存在来判断 shell 是交互式的。i
$-
preferred_shell= if [ -x /bin/zsh ]; then preferred_shell=/bin/zsh fi … if [ -n "$preferred_shell" ]; then case $- in *i*) SHELL=$preferred_shell; export SHELL; exec "$preferred_shell";; esac fi
如果您希望 zsh 读取您的
.zprofile
,请传递该-l
选项。如果您的登录 shell 是
bash
,您可以按照上述步骤进行。或者,您可以将这些命令放入~/.bash_profile
.大多数会话启动脚本仅读取~/.profile
而不读取~/.bash_profile
,但我见过一些在 bash 和读取下运行的脚本.bash_profile
,因此即使在那里,您也应该小心不要exec
在非交互式 shell 中调用。如果您的登录 shell 是 csh 或 tcsh,请参阅以下示例无需 chsh 或管理员权限即可更改默认 shell
答案3
chsh
如果因为没有管理员权限而无法运行,与这样做的人交谈。
您很可能无法chsh
以非 root 身份使用,因为您使用的系统已配置为chsh
无法工作,例如因为系统使用 NIS 或 LDAP 而不仅仅是文件/etc/passwd
。或者您的系统管理员可能只是想保持一些控制权。
更改 shell 的过程取决于您组织的策略。可能有一个本地命令可以执行chsh
通常执行的操作。或者您可能需要提交支持请求以请求更改 shell。
大多数其他答案都很好,但如果您的管理员响应合理,您可能不想费心破解您的启动脚本。我可能只是zsh -l
在登录后手动调用,直到管理员开始更新我的帐户。
另一件需要记住的事情是:有时不同的 shell 可以使用相同的启动文件。例如,sh
andbash
都可以执行$HOME/.profile
, andcsh
都tcsh
可以执行$HOME/.login
and $HOME/.cshrc
(尽管特定于 shell 的启动文件,如.bashrc
、.bash_profile
、 and.tcshrc
可以覆盖这些文件)。如果您的默认 shell 是/bin/csh
并且您想使用/bin/tcsh
,则更新您的.login
调用/bin/tcsh -l
可能会创建无限循环。zsh
不会执行bash
特定的启动文件,所以这对您来说不是问题。
大多数 shell 都会设置变量来标识您正在运行的 shell ( $BASH_VERSION
, $tcsh
, $ZSH_VERSION
)。如果您要编写启动代码来调用您喜欢的 shell,那么将其包含在if
这样只有当您尚未运行该 shell 时才会执行它。使用来自的代码康索盒子的回答:
if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
export SHELL=/bin/zsh
exec /bin/zsh -l
fi
(检查增加了复杂性,"${ZSH_VERSION:-unset}"
而不仅仅是"$ZSH_VERSION"
允许您完成的可能性set -o unset
,该选项会导致对未定义变量的引用成为错误。)
答案4
我可以想到几个场景。
zsh
不在 中/etc/shells
,并且 OP 希望使用它而无需zsh
在命令提示符下键入。可能的解决方案。a) 使用配置文件技巧在登录时执行它。这与实际更改外壳一样有效。
b) 恳求管理员添加,
zsh
以便/etc/shells
您可以chsh
添加c) 请求管理员更改您的 shell。这是不明智的,因为它会让你失去进入的能力。只有在你有 shell 的情况下
ftp
才能使用ftp
/etc/shells
用户希望逃离受限制的 shell,最有可能的
rbash
是 或rsh
.如果
.profile
是可编辑的,则PATH
可以通过编辑来扩展它。一旦/bin
进入路径,您就可以bash
从内部开始rsh/rbash
,访问chsh
命令以更改 shell。许多命令都有 shell 转义,可用于转义受限制的 shell 并重新获得对chsh
.chsh
由于其他原因确实不起作用。可能性 1 中的解决方案 a 也是此处的答案。
场景 2 是实际更改默认 shell 的唯一原因(限制太多)。