Ubuntu 20.04, 5.8.0-63-generic, gnome-shell, gdm3
Моя оболочка входа установлена в / bin / sh
, и у меня есть эта строка в мой файл $ HOME / .profile
:
shopt -q login_shell > /dev/null 2>&1 || export SHELL=/bin/zsh
Теперь, насколько я понимаю, экспорт SHELL = / bin / zsh
не должен выполняться при входе в систему, верно? поскольку это оболочка входа в систему, поэтому shopt -q login_shell> / dev / null 2> & 1
имеет значение True.
Но после входа в систему я получаю $ SHELL как / bin / zsh.
На самом деле установка $ SHELL меня не касается, я хочу использовать shopt -q login_shell> / dev / null 2> & 1
в логике .zshrc. Мне нужно, чтобы это работало, чтобы выборочно запускать вещи в оболочке без входа в систему.
Не могу понять, что не так. Нужна помощь!
Редактировать:
Shopt не является командой / bin / sh. Но даже изменение оболочки входа в / bin / bash не помогает.
shopt
не является допустимым в оболочке POSIX 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
, который он исходит) может быть прочитан другими оболочками, лучше всего поддерживать его совместимость с POSIX. AFAIK, способ POSIX проверить оболочку входа в систему - это проверить, начинается ли $ 0
с символа -
например.
case $0 in
-*) echo "login shell"
;;
*) echo "non-login shell"
;;
esac