При интерпретации этой блок-схемы
Я обнаружил, что в человеке 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'
, это логин, но он интерактивный. Нам нужен логин и неинтерактивность . Что мне не хватает?<<<"$-"
, который$-
расширяется вызывающей оболочкой из-за двойных кавычек. Вызываемая оболочка не является интерактивной, потому что ее стандартный ввод не является tty.exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOF
чтобы получить это подтверждение:$'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'
так что, да, возможна неинтерактивная оболочка входа в систему, и она все еще читается/etc/profile
. Должны ли мы сделать вывод, что ВСЕ оболочки входа в систему читаются/etc/profile
?exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF
:).bash
с обработкой стартового файла IMO довольно запутан, вы обнаружите, что некоторые системы исправили его для более разумного поведения, добавив еще больше вариаций.Да, возможны неинтерактивные логины
источник
su -c 'echo hello' -
. Который, чтобы проверить то , что нам нужно, следует записать так:su -c 'echo $0 $-; shopt -p login_shell' -
чтобы получить этот ответ , подтверждающий (закодированный в кавычках C):$'/etc/profile read \n -su hBc \n shopt -s login_shell'
. Это подтверждает, что неинтерактивная оболочка входа в систему была оправдана и что в процессе была прочитана / etc / profile. Спасибо.ДА.
Однако обратите внимание,
/etc/profile
что не будет использоваться для неинтерактивной оболочки входа в систему, если--login
не указан аргумент.Распространенная идиома, которая вызывает неинтерактивную оболочку входа в систему:
Но страдает тот факт, что
/etc/profile
не выполняется.Это поведение можно изменить, но оно включает в себя настройку исходного кода Bash во время компиляции, раскомментировав параметр, найденный в config-top.h :
Когда я исследовал эту
su
аномалию , я обнаружил, что другие оболочки, в том числеzsh
иdash
не имеют этого несоответствия.источник