.profile 中的登录 shell 检查不起作用

.profile 中的登录 shell 检查不起作用

Ubuntu 20.04,5.8.0-63-通用,gnome-shell,gdm3

我的登录 shell 设置为 /bin/sh

我的文件中有以下行$HOME/.profile

shopt -q login_shell > /dev/null 2>&1 || export SHELL=/bin/zsh

现在据我理解export SHELL=/bin/zsh不应该在登录时执行,对吗?因为它是一个登录shell,所以shopt -q login_shell > /dev/null 2>&1是真的。

但是登录后我得到的 $SHELL 是 /bin/zsh。

实际上设置 $SHELL 不是我关心的问题,我想shopt -q login_shell > /dev/null 2>&1在 .zshrc 逻辑中使用。我需要让它工作以选择性地在非登录 shell 中运行。

不知道哪里出了问题。需要帮助!

编辑:

Shopt 不是 /bin/sh 命令。但即使将登录 shell 更改为 /bin/bash 也无济于事。

答案1

shopt在 POSIX shell 中不是有效命令shzsh使用setopt/ 的也不是unsetopt),因此会出错 - 使得测试无条件返回非零:

$ bash -lc 'shopt -q login_shell; echo $?'

0

$ sh -lc 'shopt -q login_shell; echo $?'
sh: 1: shopt: not found
127

$ zsh -lc 'shopt -q login_shell; echo $?'
zsh:1: command not found: shopt
127

由于~/.profile(以及/etc/profile,加上其中的文件/etc/profile.d)可能被其他 shell 读取,因此最佳做法是使其符合 POSIX 标准。据我所知,检查登录 shell 的 POSIX 方法是测试是否$0-字符开头 ex。

case $0 in 
  -*) echo "login shell"
   ;; 
   *) echo "non-login shell"
   ;;
esac

相关内容