Руководство Bash говорит:
Bash пытается определить, когда он запускается со своим стандартным входом, подключенным к сетевому соединению, как при выполнении демоном удаленной оболочки, обычно rshd, или демоном защищенной оболочки sshd. Если Bash определяет, что он выполняется таким образом, он читает и выполняет команды из ~ / .bashrc, если этот файл существует и доступен для чтения.
Это источники Bash ~/.bashrc
:
ssh user@host :
Но это источники Bash ~/.bash_profile
:
ssh user@host
Я не вижу разницы в этих двух командах согласно спецификации. Разве stdin не подключен к сетевому соединению в обоих случаях?
Ответы:
Оболочка входа сначала читает,
/etc/profile
а затем~/.bash_profile
.Оболочка без входа в систему читает
/etc/bash.bashrc
и затем~/.bashrc
.Почему это важно?
Из-за этой строки в
man ssh
:Другими словами, если команда ssh имеет только параметры (не команду), например:
Это запустит оболочку входа в систему, оболочка входа в систему читает
~/.bash_profile
.Команда ssh, которая имеет команду , например:
Где команда
:
(или ничего не делать).Это не запустит оболочку входа в систему, поэтому
~/.bashrc
это то, что будет прочитано.Удаленный ввод
Предоставленное tty-соединение для / dev / stdin на удаленном компьютере может быть действительным tty или чем-то другим.
Для:
Который заканчивается TTY (не сетевым подключением), как его видит запущенный bash.
Для соединения SSH с помощью команды:
Список TTY начинается так же, но обратите внимание, что / etc / profile не был получен.
Что говорит оболочке, что соединение представляет собой канал (не сетевое соединение).
Таким образом, в обоих тестовых случаях оболочка не может знать, что соединение из сети и, следовательно, не читает
~/.bashrc
(если мы говорим только о соединении с сетью). Он читает ~ / .bashrc, но по другой причине.источник
~/.bashrc
чтения?stdin
подключена к сети . Почему вы так думаете? (Ответ отредактирован, пожалуйста, прочитайте).Вы спрашиваете «почему», а не «как», поэтому я постараюсь ответить с этой точки зрения. Следующее будет хорошим объяснением того, почему вещи произошли в прошлом, чтобы привести к тому, как они происходят сегодня.
Причиной наличия двух разных файлов запуска ("profile" и "rc") является то, что в прошлом обычным способом работы на машине было:
Войдите в систему с какого-то реального терминала или другой рабочей станции и получите оболочку входа . Эта оболочка будет вызывать
/etc/profile
и~/.profile
настраивать среду для пользователя.Вызвать среду, в которую хочет войти пользователь. Эта среда может быть Xorg, но в большинстве случаев это был мультиплексор, такой как экран GNU.
Среда (например, экран GNU) будет затем вызывать дополнительные (не входящие в систему) оболочки, которые наследуют среду от родительской оболочки входа.
Это был обычный способ входа в машину UNIX в течение того времени , когда
csh
и вbash
настоящее время разрабатываются. Поэтому считалось расточительным читать~/.profile
снова в оболочках, которые все равно наследовали окружающую среду.bash
затем добавлена~/.bashrc
дополнительная конфигурация для этих оболочек без входа в систему.csh
(иtcsh
) никогда не добавлял какой-либо "rc" -файл для оболочек без входа в систему. Обратите внимание, чтоcsh
/tcsh
не являются оболочками, совместимыми с оболочкой Борна (которая является частью POSIX)bash
. Другая совместимая с bourne оболочкаksh
добавила переменную окружения (называемаяENV
), которая, если она была определена, использовалась бы в качестве файла команд запуска ("rc") для отсутствия входа в системуksh
.Так что да, более новые версии оболочек Борна добавили дополнительный файл конфигурации для удобства псевдонимов и других быстрых опций, которые будут присутствовать внутри оболочек, мультиплексированных экраном GNU (или аналогичными), но не присутствующих в оболочке, которую вы получаете при первом входе в машина.
С появлением менеджеров графического отображения (GDM) различие между файлами «profile» и «rc» стало бессмысленным, потому что GDM будет иметь свои собственные файлы инициализации (например,
~/.xinit
и~/.xsession
). Тогда оболочки, указанные внутри GDM, могут быть оболочками для входа или не входа в зависимости от прихотей пользователя, и случай, когда оболочка без регистрации всегда будет иметь родителя, который является оболочкой входа, больше не соответствует действительности.дополнительный
Одна из моих любимых таблиц о сравнении файлов запуска оболочки показывает, как оболочки, совместимые с оболочкой bourne, используют
profile
файлы, а другие - нет. Это связано с тем, что в прошлом исходная оболочка (та, которая запустила мультиплексирование) должна была быть оболочкой, совместимой с bourne.источник