Інтерпретуючи цю блок-схему
Я виявив, що в man bash:
Коли bash викликається як інтерактивна оболонка для входу, або як неінтерактивна оболонка з опцією --login, вона спочатку зчитує та виконує команди з файлу / etc / profile, якщо такий файл існує.
Це говорить про те, що інтерактивні оболонки входу читають /etc/profile
(без --noprofile)
Також неінтерактивні оболонки з можливістю --login
зчитування/etc/profile
Це, здається, залишає деякі можливі оболонки входу (в яких $0
починається з а -
), які неінтерактивні (запустіть сценарій, можливо, настільки ж просто date
), як не можна читати (джерело) /etc/profile
.
Щоб підтвердити або спростувати цю ідею:
Спершу я спробував використати su -l -
, яка запускає оболонку входу з -
першим символом, але я не можу зробити її неінтерактивною (і зможу представити тести, щоб перевірити її).
Викликати щось на кшталт
$ bash -c 'date' -bash
Не повідомляється про оболонку входу (навіть якщо перший символ є a -
).
Спробуйте це, щоб розкрити деталь:
$ 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
a має-
як перший символ, немає значенняi
(інтерактивне) значення,$-
але воно не повідомляється якlogin_shell
(-u). У цьому випадку / etc / профіль не був прочитаний, але я не впевнений, що це правильний тест.
Існує також згадка про «рідкісних неінтерактивний оболонок входу в систему » в цій відповіді , не будучи достатньо конкретним для цього питання.
Висновок цього хлопця в тому , що /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
файл?
Якщо вищезазначене вірно, ми маємо зробити висновок, що ВСІ оболонки входу [інтерактивні (чи ні)] читання / тощо / профіль (без --noprofile
опції).
Примітка: щоб виявити, що / etc / профіль читається, просто додайте на самому початку файлу цю команду:
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'
, то він є логіном, але він є інтерактивним. Нам потрібні логін та неінтерактивний . Чого я пропускаю?