
Я использую RHEL6 (ядро 2.6.32-573.el6.x86_64). У меня есть псевдонимы, которые берутся при ssh
переходе в myserver
. Один из них —
alias scl-devtoolset-3='source /usr/local/bin/scls/devtoolset-3'
Предположительно, он является псевдонимом в оболочках, не предназначенных для входа (см. ниже), но ssh
ing дает оболочку входа, и это подтверждается строкой
shopt -q login_shell && echo 'This is a login shell' || echo 'This is a non-login shell'
в моем ~/.bashrc
, который производит
This is a login shell
как и ожидалось. Таким образом, я понятия не имею, почему/где установлен псевдоним.
Как объяснить это, казалось бы, противоречивое обстоятельство?
Файлы, присутствующие в моей системе:
/etc/profile
/etc/bashrc
/etc/profile.d/*
~/.bashrc
Файлы, отсутствующие в моей системе:
/etc/bash.bashrc
~/.profile
TL;DR
Похоже, что псевдоним задается (только в оболочках без входа в систему) следующими строками в /etc/bashrc
:
...
if ! shopt -q login_shell ; then # We're not a login shell
...
# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
...
fi
какой исходный файл /etc/profile.d/scl-aliases.sh
содержит
#!/bin/bash
sources_dir=/usr/local/bin/scls
for scl in `ls $sources_dir`; do
alias scl-$scl="source $sources_dir/$scl"
done
и учитывая, что
$ ls /usr/local/bin/scls
devtoolset-3 devtoolset-4 devtoolset-6 python27 python33
Это было (частично?) подтверждено запуском bash -x
в командной строке после ssh
ing.
решение1
Это на самом деле нормальное поведение. Это сводится к разным файлам, которые исходят из скриптов входа и не входа. Это былошироко освещено в других местахно, вкратце, (интерактивные) оболочки bash без входа в систему являются источником семейства файлов bashrc ( /etc/bash.bashrc
, ~/.bashrc
), а (интерактивные) оболочки входа в систему являются источником различных файлов профилей ( /etc/profile
, ~/.profile
).
Итак, ваш /etc/bashrc
(который, как я думаю, является эквивалентом /etc/bash.bashrc
в macOS и, возможно, в других системах) читается только интерактивными оболочками, не требующими входа в систему, иудаленные демоны оболочки. При чтении этого файла, если оболочка, читающая его, не является оболочкой входа в систему (то есть не является демоном удаленной оболочки), она также добавляет определенные файлы в /etc/profile.d
.
Однако оболочки входа не читают этот файл, поэтому он здесь не актуален. Вместо этого они будут читать, /etc/profile
и если вы проверите этот файл, вы найдете что-то вроде этого (из /etc/profile
файла на моем Arch):
# Load profiles from /etc/profile.d
if test -d /etc/profile.d/; then
for profile in /etc/profile.d/*.sh; do
test -r "$profile" && . "$profile"
done
unset profile
fi
Вот почему вы видите их в оболочке входа. Это потому, что оболочки входа не работают bashrc
, а вместо этого имеют свои собственные файлы настройки, и они вносят файлы под /etc/profile.d
оболочки входа, но не исключают их.
решение2
Я публикую это как ответ, учитывая, что комментарии не могут иметь отступ кода. Респектответ тердона.
Как заявил terdon, у меня /etc/profile
есть следующие строки.
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
Они будут отвечать за псевдоним, а не /etc/bashrc
. Это можно легко проверить с помощью решения дляОтслеживание последовательности скриптов/команд, выполняемых по ssh