Проверка оболочки входа не работает в .profile

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 не помогает.

0
задан 31 July 2021 в 05:33

1 ответ

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
1
ответ дан 20 August 2021 в 10:31

Другие вопросы по тегам:

Похожие вопросы: