当 ksh 是 shell 时使用 bash

当 ksh 是 shell 时使用 bash

我可以访问多个 RHEL 系统,这些系统使用 Active Directory 作为用户帐户,并使用 NFS 挂载作为主目录。

我们的登录 shell 存储在 Active Directory 中并且始终为/bin/ksh.我想永远拥有/bin/bash,所以我想我可以在 中实现这一点~/.profile。在阅读了这里和 SO 上的几篇文章后,我想出了这个:

if [ ! -n "$BASH" ] ;then
    SHELL=`type -P bash`
    exec bash -l;
fi
  • 这是执行此操作的标准/好方法吗?
  • 我读! -n "$BASH"NOT ("$BASH" is NOT null)
    • 因此true,如果它为空,false如果它不为空。
    • 如果是这样那为什么不只是-z "$BASH"或者甚至! "$BASH"

答案1

您显示的代码很可能用于bash从您的~/.profile文件启动登录 shell。我个人会用这样的command方式来检测是否存在bash

if [ -z "$BASH" ]; then
    shell=$( command -v bash )
    if [ -n "$shell" ]; then
        exec env SHELL="$shell" bash --login
    fi
    unset shell
    echo 'Bash not present, continuing...' >&2
fi

bash这获取到的路径$shell,然后用于测试是否bash可用设置SHELL环境变量bash

是否使用[ ! -n "$BASH" ]or[ -z "$BASH" ]并不重要(所以做任何感觉正确且最容易阅读的事情),但我可能会不是使用! [ "$BASH" ][ ! "$BASH" ].在一般情况下,您可能最终会测试以破折号开头的字符串,这可能会混淆测试,因此在测试字符串是否为空时最好坚持使用-nor 。-z

~/.profile如果系统管理员有一天决定卸载bash,并改为编写一个单独的~/.bash_profile文件,您可能还希望保持基本不变(除上述内容外)。如果可用,bashshell 将使用,而不是,并且启动失败将导致您的默认登录 shell 成功使用,而不会因可能的 bashisms 而绊倒。~/.bash_profile~/.profilebash~/.profile

相关内容