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 中不是有效命令sh
(zsh
使用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