저는 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
긴 이야기 짧게
별칭은 다음 줄을 통해 설정된 것으로 보입니다(비로그인 쉘에서만) /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
이는 ing bash -x
후에 명령 프롬프트에서 실행하여 (부분적으로?) 확인 되었습니다 ssh
.
답변1
이는 실제로 정상적인 동작입니다. 이는 로그인 스크립트와 비로그인 스크립트 소스에 대한 서로 다른 파일로 귀결됩니다. 이건 이미다른 곳에서도 광범위하게 다루어짐그러나 간단히 말하면 (대화형) 비로그인 bash 쉘은 bashrc 시리즈 파일( /etc/bash.bashrc
, ~/.bashrc
)을 획득하고, (대화형) 로그인 쉘은 다양한 구성 파일( /etc/profile
, ~/.profile
)을 획득합니다.
따라서 귀하의 /etc/bashrc
(내 생각에 이것은 /etc/bash.bashrc
macOS 및 기타 시스템과 동일하다고 생각합니다) 대화형 비로그인 셸에서만 읽을 수 있습니다.원격 쉘 데몬. 파일을 읽을 때 파일을 읽는 쉘이 비로그인 쉘(따라서 원격 쉘 데몬이 아닌 경우)인 경우에도 이 현상이 발생합니다 /etc/profile.d
.
그러나 로그인 쉘은 이 파일을 읽지 않으므로 여기서는 관련이 없습니다. 대신 그들은 를 읽고 /etc/profile
파일을 검사하면 다음과 같은 내용을 찾을 수 있습니다( /etc/profile
내 아치의 파일에서).
# 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를 통해 실행된 스크립트/명령의 추적 순서