4

Я добавил каждый из моих файлов конфигурации bash (~/.bashrc , ~/.bash_profile , ~/.profile) с echo NAME_OF_FILE , т.е. я получаю «.bashrc», когда исходный код находится в ~/.bashrc .

Меня сбивает с толку то, почему я получаю и указывает, что ~/.bashrc включается, когда я запускаю команду через ssh. Например, если я сделаю:

ssh localhost echo hi

я получил

.bashrc
hi

Почему в этом контексте используется ~/.bashrc ? Разве это НЕ должно быть получено, поскольку это должно запустить неинтерактивный сеанс bash?

В самом деле, ssh localhost tty дает мне «не tty» (ему предшествует «.bashrc», что указывает на то, что ~/.bashrc получен, тем не менее).

Я grep ped все мои файлы конфигурации для получения команд в ~/.bashrc явно, и нет ни одного, который объясняет это.

(У меня есть только tty -s && shopt -q login_shell && [[ -r ~/.bashrc ]] && . ~/.bashrc в моем .bash_profile так что я получаю '.bashrc' даже в интерактивных оболочках входа в систему, но это не объясняет проблему ssh - я могу закомментировать ее, и я все еще получаю то же поведение с приведенными выше примерами ssh)

Как я могу отладить это?

1 ответ1

7

Со страницы bash :

Bash attempts to determine when it is being run with its standard input
connected to a a network  con‐nection,  as  if  by  the remote shell daemon,
usually rshd, or the secure shell daemon sshd.  If bash
determines it is being run in this fashion, it reads and executes commands
from  ~/.bashrc,  if  that file  exists and is readable.

Т.е. ~/.bashrc запустится, когда вы вызовете его через ssh , независимо от того, есть ли у вас tty или нет.

Если вы хотите, чтобы ваш .bashrc работал только в интерактивном режиме, попробуйте это вверху:

# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return

Если это не сработает, попробуйте это:

[ -z "$PS1" ] && return

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .