При интерпретации этой блок-схемы
Я обнаружил, что в человеке Bash:
Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с параметром --login, она сначала читает и выполняет команды из файла / etc / profile, если этот файл существует.
Это означает, что интерактивные оболочки входа в систему читаются /etc/profile
(без --noprofile)
Также неинтерактивные оболочки с опцией --login
чтения/etc/profile
Это, похоже, оставляет некоторые возможные оболочки входа в систему (в которых $0
начинается с a -
), которые не являются интерактивными (запустить скрипт, может быть, так же просто, как date
), могут не читаться (источник) /etc/profile
.
Чтобы подтвердить или опровергнуть эту идею:
Сначала я попытался использовать su -l -
, который запускает оболочку входа в систему с -
первым символом, но я не могу сделать его неинтерактивным (и не могу представить тесты для его проверки).
Называть что-то вроде
$ bash -c 'date' -bash
Не сообщает, что является оболочкой входа (даже если первый символ - -
).
Попробуйте это, чтобы раскрыть детали:
$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016
$0
Имеет в-
качестве первого символа, не существуетi
(интерактивный) стоимости ,$-
но не сообщается , какlogin_shell
(на -u). В этом случае / etc / profile не был прочитан, но я не уверен, что это правильный тест.
В этом ответе также упоминается о «редких неинтерактивных оболочках для входа в систему», которые недостаточно конкретны для этого вопроса.
Заключение этого парня в том , что /etc/profile
всегда читается.
Прочитайте сводную таблицу: прочитаны как интерактивные, так и неинтерактивные оболочки входа /etc/profile
И, если примеры с этой страницы верны:
Some examples
$ su bob # interactive non-login shell
$ su - bob # interactive login shell
$ exec su - bob # interactive login shell
$ exec su - bob -c 'env' # non-interactive login shell
$ ssh bob@example.com # interactive login shell, `~/.profile`
$ ssh bob@example.com env # non-interactive non-login shell, `~/.bashrc`
Тест exec su - bob -c 'env'
отчетов, которые /etc/profile
были прочитаны.
Короче говоря:
Возможно ли иметь неинтерактивную оболочку входа в систему (не вызывается с --login или -l)?
И если правда, это чтение /etc/profile
файла?
Если вышеприведенное верно, мы должны сделать вывод, что ВСЕ оболочки входа [интерактивные (или нет)] читают / etc / profile (без --noprofile
опции).
Примечание: чтобы обнаружить, что / etc / profile читается, просто добавьте в самом начале файла эту команду:
echo "'/etc/profile' is being read"
--login
опцию. Во-вторых, если яexec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"
получу (закодирован в C qoutes)$'/etc/profile read\nshopt -s login_shell\nbash himBH'
, это логин, но он интерактивный. Нам нужен логин и неинтерактивность . Что мне не хватает?