답변:
/etc/profile 특정 목적이기 때문에 로그인 쉘에 대해서만 호출됩니다.로그인 쉘 이 아닌 대화식 쉘에 대해 명령을 실행하고을 사용하려면 또는에 bash넣으십시오 .~/.bashrc/etc/bash.bashrc
"프로파일"파일의 목적은 로그인 쉘에 대해서만 실행되어야하는 명령을 포함하는 것입니다. 이러한 파일은 다음과 같습니다.
/etc/profile로그인 쉘로 시작하면 모든 Bourne 호환 쉘 ( bash및 포함 dash)이 실행합니다 .
에서 스크립트 /etc/profile.d.
이것은 Bourne 스타일 쉘용이지만 쉘 실행 파일 자체에는 코딩되어 있지 않습니다. 오히려, 명령은이를 /etc/profile호출합니다. 예를 들어, Ubuntu 12.04 시스템에서 /etc/profile다음 행을 포함합니다.
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
.profile 사용자의 홈 디렉토리에서 로그인 쉘로 시작할 때 Bourne 호환 쉘에 의해 실행됩니다 (재정의되지 않은 경우 아래 참조).
.bash_profile또는 .bash_login사용자의 홈 디렉토리에 있습니다. 이 외의 다른 쉘에서는 무시됩니다 bash. 그러나 .bash_profile존재하는 경우 대신bash 실행하십시오 . 경우 존재하지 않지만 존재, 그 대신 실행됩니다 . .profile.bash_profile.bash_login.profile
(그러나 .bash_profile또는 .bash_login존재하는 경우 * 명시 적으로을 호출하도록 작성 되는 것이 일반적입니다 .profile.)
쉘 특정 프로파일 파일 의 장점은 해당 쉘에만 유효한 명령 또는 구문을 포함 할 수 있다는 것입니다. 예를 들어 / 에서 [[평가 연산자를 사용할 수는 있지만 평가 연산자를 사용한 다음 쉘로 로그인 하면 실패합니다..bash_profile.bash_login.profiledash
"프로파일"파일에는 로그인 시작시 한 번만 실행해야하는 명령이 포함되어야합니다. (이것은 로그인 쉘로 시작하는 그래픽 로그인도 포함합니다.) 쉘이 대화식이면 쉘을 실행하는 사용자가 로그온했을 가능성이 있으므로 아마도 조상 (시작했거나 시작한 시작)을 가지고있을 것입니다. 또는 로그인 쉘 등을 시작했습니다.
다음과 같은 이유로 명령을 한 번만 실행할 수도 있습니다.
바람직하지 않은 결과가 발생하는 두 번째 상황의 예로, 모든 사용자에게 기본적으로 나타나는 다음 행을 고려하십시오 ~/.profile.
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
SSH를 시작하고 다른 쉘 (예 :)을 실행했다고 가정 zsh하고 어느 시점에서 일시적으로 돌아가고 bash환경을 유지하고 싶었다는 것을 알게 된 다음 ( ) bash에서 다시 실행 한 다음 쉘을 부분으로 실행하는 zsh것과 같은 프로그램 mc을 실행했습니다 인터페이스의. 경우 bin홈 폴더에 존재하는 사용자 이름은 james당신의 PATH가장 안쪽 껍질 같은 것입니다 :
/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
그것은 비효율적이며 (더 중요하게는)의 내용을 이해하기 어렵게 만듭니다 PATH.
그러나 이것은 결코 재앙이 아닙니다. 내가 알 수있는 한, 모든 대화식 쉘이 "프로파일"파일을 소스로 만들면 기본 구성에서 끔찍한 일이 발생하지 않습니다 . 그러나 "프로파일"파일의 목적은 로그인 당 한 번만 실행되는 명령을 포함하는 것이므로 사용자 또는 관리자는 로그인 쉘을 시작할 때만 실행 해야하는 명령을 프로파일에 추가 할 수 있습니다 .
를 사용하는 경우 bash모든 대화식 쉘에서 실행되는 명령 파일이 있습니다.
/etc/bash.bashrc.bashrc 사용자의 홈 디렉토리에 있습니다.이것은 가장 일반적으로 사용되는 명령에 사용됩니다
예를 들어, 명령 줄 탭 완성은 일반적으로 bash로그인 쉘 인지 여부에 관계없이 활성화되어야합니다 . 그래서 이것은 다음에 나타납니다 ~/.bashrc:
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
가, 1 과 2 모두 적용이이 일 안에 실행되는 다른 조개에 이월되지 않으며, 탭 완료에서 작동합니다 bash내가 다른 쉘에 로그인 한 경우에도 마찬가지입니다.
bash로그인 쉘과 대화식 쉘에서 명령을 사용 하고 있고 로그인 쉘이 아닌 명령을 사용하려면 일반적으로 /etc/bash.bashrc또는 에 넣는 것으로 충분합니다~/.bashrc . 이것은 기본적으로 때문입니다 /etc/profile및 ~/.profile명시 적으로 실행합니다. 예를 들어, ~/.profile이 있습니다 :
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
(와 유사하게 /etc/profile소스 /etc/bash.bashrc입니다 bash.)
따라서 대화식 bash쉘 을 시작할 때 " 로그인 "파일과 "rc"파일이 모두 실행됩니다 (로그인 쉘인지 여부).
모든 비 대화식 쉘이 실행되도록 명령을 지정하지 않을 수도 있습니다. 스크립트가 실행될 때마다 실행됩니다 (스크립트를 실행하도록 구성한 쉘에서 스크립트가 실행되는 경우).
이로 인해 상당한 파손이 발생할 수 있습니다. 이 작업을 수행 할 때 사용중인 계정 외에 시스템에 관리자 계정이없는 경우 관리자 계정을 만들 수 있습니다. 실수를 쉽게 해결할 수 있습니다.
에서 bash의 "RC"파일이 실제로 실행되는 쉘이 대화 형인지 여부 . 그러나 상단에는 다음과 같이 말합니다.
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
따라서 스크립트를 실행하기 위해 실행되는 것과 같은 비 대화식 쉘에서도 자동으로 실행되는 명령이 필요한 경우 해당 행 앞에 명령을 추가 할 수 있습니다 .
로그인하면 로그인 쉘이 시작됩니다. 그 후 쉘이 로그인 쉘로 작동하도록하려면 -l플래그로 시작하십시오 ( l ogin을 의미 ). 예를 들면 다음과 같습니다.
다른 사용자 로 로그인하지 않으려면 로그인 쉘을 사용하지 않고 로그인 쉘을 시작하는 가장 좋은 방법 입니다. 그런 다음 다음을 사용하십시오.
sudo -i대한 root(사용 sudo -s비 로그인에 대한 대화 형 루트 쉘)sudo -u username -i 모든 사용자su - username비 root사용자 용 ( 로그인하지 않은 대화식 루트 셸에 사용)su username초기 로그인 쉘은 A와 동일 로그인 쉘 . 이 답변의 모든 곳에 "login shell"이라고 적혀 있는데 "initial login shell"이라고 말할 수 있습니다 (이 부분은 이미 이해가 멈췄을 것입니다).
초기 로그인 쉘 이라는 용어의 한 가지 이유 는 로그인 쉘 이 다른 의미 로 사용되어 로그온 할 때 실행되는 쉘로 사용 되는 프로그램 을 식별하기 때문입니다. 이것은 다음과 같은 로그인 쉘 의 의미입니다 .
bash 맨 페이지In bash, the "rc" files are actually run whether the shell is interactive or not. 부정확하다. /etc/bash.bashrc는 /etc/bash.profile에 의해 트리거됩니다.