안녕하세요 여러분~ 마무입니다. 오늘은 서버운영 혹은 보안공부를 위한 초석을 만들기 위해 꼭 알아둬야할 "쉘", "환경변수란" "bashrc", "/etc/bashrc", ".bash_profile", "/etc/profile", ".bash_history" 등등에 대해 포스팅 해보겠습니다.
--목차--
i) 리눅스 쉘이란, chsh
ii) 환경변수란, .bashrc , /etc/bashrc
iii) .bash_profile , /etc/profile, $PATH $HOME
iv) .bash_history
v) .bash_logout
vi) /etc/profile , .bash_profile , .bashrc , /etc/bashrc 순서
vii) 총 정리
--------
입니다.
여기서 못 찾은 정보는
리눅스 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_13.html
에서 찾아보세요!
i) 리눅스 쉘이란, chsh
하지만 간단하게는 이 개념을 알고 있어야지 뭔가 찝찝한 느낌없이 리눅스를 완벽하게 배울 수 있을겁니다.
"쉘(셸)"은 한번쯤 컴퓨터쪽으로 종사하시는 분들이라면 들어봤을
"커널"이란 것과 함께 운영체제를 이루는 요소들중 한 부분입니다.
"커널(kernel:낱알,알맹이,핵심)"이 핵심이란 뜻을 가진 것처럼
운영체제 중심에서 가장많은 역할을 하듯이
"쉘(shell:껍데기)"은 껍데기마냥 운영체제 바깥쪽에서 명령어를 해석해주는
역할을 합니다.
좀 더 자세히 말하자면, '커널'이란 저희가 보통 운영체제의 기능이라 생각하는 것들의 대부분(네트워크를 위한 소켓 생성, 메모리 관리, 디스크 관리 등등) 기능을 큼직하게 부르며
'쉘(셸)'이란 운영체제와 유저의 상호작용 속에서 유저의 행동(주로 명령어)을 운영체제에게 전달하고, 그 역도 수행하는 '번역가' 같은 역할입니다.
위 그림처럼 명령어를 해석해서 kernel에게 전달해준다 이렇게 이해하시면 될 것 같습니다.
특히 윈도우와 달리 리눅스는 주로 "CLI" 환경에서 사용하기에 이 쉘이란 것이 정말 중요합니다.
위에서 언급했듯이 쉘이란 것은 유저와 커널 사이 번역가 같은 역할이기 때문에, 하나가 아니라 다양하게 있으며 그렇기에 유저에 입맛에 따라서 변경이 가능합니다.
위 그림처럼 명령어를 해석해서 kernel에게 전달해준다 이렇게 이해하시면 될 것 같습니다.
특히 윈도우와 달리 리눅스는 주로 "CLI" 환경에서 사용하기에 이 쉘이란 것이 정말 중요합니다.
위에서 언급했듯이 쉘이란 것은 유저와 커널 사이 번역가 같은 역할이기 때문에, 하나가 아니라 다양하게 있으며 그렇기에 유저에 입맛에 따라서 변경이 가능합니다.
이때 원하는 셸이 있다는 가정하에 chsh(change shell) -s(shell) [쉘 명령어 경로]
형태로 명령어를 사용하면 변경이 가능합니다.
리눅스에서 가장 대표적으로 사용하는 쉘들에는
"sh"이 가장 먼저 만들어진 쉘로서, 다른 모든 쉘들의 기초바탕이 됐습니다.
그래서 쉘 이름들은 하나같이 앞에 어떤 "단어 + sh(shell)" 형식의 이름들이 됐습니다.
그다음 "csh", 그다음 "ksh"가 나오고, 위 3가지를 짬뽕시킨게 바로 "bash"입니다.
이 "bash"가 현재 대부분의 리눅스에서 쓰이는 쉘이고 저희가 사용하는 "Centos"도 이 bash를 사용합니다
리눅스를 키고 root로 접속하시면
이런 화면이 나오죠?
여기서 터미널을 열어볼 껍니다.
이렇게 배경에 마우스 우클릭을 하시면
맨 밑에 "터미널 열기"가 보이실 거에요 그걸 클릭하시면
요렇게 터미널이 나옵니다.물론 제가 엔터를 2번 쳤지만요(습관이..)
저희 Centos가 bash쉘을 사용한다는 걸 바로 보기 위해 "ls(list) -a"란 명령어를 쳐보겠습니다.
그러면 결과가
이렇게 나오는데요 ".bash"로 시작하는 파일이 4개 보이실 겁니다. 그리고 이 파일들 앞에 붙은 "."은 숨긴 파일들을 의미합니다. 그래서 특수한 명령어 옵션 "-a"를 안붙이면 안보이죠
네? 옆에 cshrc랑 tcshrc도 있다고요?그건 bash가 아니기때문에...
네? 그럼 bash만 쓰지 왜 (csh)rc랑 (tcsh)rc가 있냐고요?
sh(Bourne Shell) :Stephen Bourne이라는 사람이 개발했다.
csh(C shell)
ksh(Korn shell)
Bash(Bourne Again shell)
등등... 이 있습니다.
그래서 쉘 이름들은 하나같이 앞에 어떤 "단어 + sh(shell)" 형식의 이름들이 됐습니다.
그다음 "csh", 그다음 "ksh"가 나오고, 위 3가지를 짬뽕시킨게 바로 "bash"입니다.
이 "bash"가 현재 대부분의 리눅스에서 쓰이는 쉘이고 저희가 사용하는 "Centos"도 이 bash를 사용합니다
리눅스를 키고 root로 접속하시면
이런 화면이 나오죠?
여기서 터미널을 열어볼 껍니다.
이렇게 배경에 마우스 우클릭을 하시면
맨 밑에 "터미널 열기"가 보이실 거에요 그걸 클릭하시면
요렇게 터미널이 나옵니다.
저희 Centos가 bash쉘을 사용한다는 걸 바로 보기 위해 "ls(list) -a"란 명령어를 쳐보겠습니다.
그러면 결과가
이렇게 나오는데요 ".bash"로 시작하는 파일이 4개 보이실 겁니다. 그리고 이 파일들 앞에 붙은 "."은 숨긴 파일들을 의미합니다. 그래서 특수한 명령어 옵션 "-a"를 안붙이면 안보이죠
네? 옆에 cshrc랑 tcshrc도 있다고요?
네? 그럼 bash만 쓰지 왜 (csh)rc랑 (tcsh)rc가 있냐고요?
"rc"란 "run commands"의 줄인 말로써 스크립트 파일(프로그래밍 언어로 짠 코드같은 거라 보시면 됨)이라 생각하시면 됩니다.
'rc'파일은 특정 프로그램(명령어)가 실행될 때 같이 실행되서, 이 파일 내에 적혀있는 내용을 프로그램에 적용하는 '초기화 파일'입니다.
쉽게 말해서 그냥 '추가 옵션 설정 파일'이라고 생각하면 됩니다.
특히 이렇게 특정 유저의 '홈 디렉터리'안에 있는 경우가 그 유저만을 위한 '설정'을 적용하기 위해서 있는 겁니다.
이런 설정 적용 내용은 밑에서 더욱 자세하게 다루겠겠습니다.
다시 돌아와 리눅스에서 쉘을 여러개를 쓰는 건 여러 이유가 있는데요 먼저
첫 번째 이유는 쉘이란 건 취향에 따라 변경이 가능하며 그렇기에 현재의 쉘에 없는 기능을 쓰기 위해서이고
두 번째 이유는 지금이야 별로 사용되지 않는 쉘이지만, 그 쉘을 필요로 하는 프로그램이 있을 수 있기 때문입니다.
csh랑 tcsh와 같은, 다른 쉘들을 사용하는 것도 같은 이유에서입니다.
자 다시 돌아가서 ".bash"로 시작하는 파일들이 보이는데 이것이 바로 저희가 bash를 쓰기에 존재하는 설정 파일인 것이고, 따라서 bash를 우리가 사용한다는 것을 알 수 있죠.
이렇게 홈 내에서 확인하는 것 외에도 내가 무슨 쉘을 쓰고있는 지 아는 가장 쉬운 방법은, 바로 없는 명령어를 쳐보는 겁니다. 그러면
이런식으로 우리가 쓰고있는 쉘, bash는 "ee"란 명령어를 해석할 수 없다고 뜨는 것을 알 수 있습니다.
혹은 특수한 환경(해킹을 위한 리버스 쉘 등등)에선 자신이 무슨 쉘이 적용됐는지 알 수가 없는 경우가 있는데요 이런 경우 유저마다 적용된 '$SHELL'이란 환경변수를 확인해보면 알 수 있습니다.
여기서 ".bash"로 시작하는 바탕화면에 숨겨진 파일들에 대해 자세히 설명해보자면
.bashrc : 리눅스 부팅시 설정해둔 함수나 alias환경변수를 bash에 적용하는 파일이고
.bash_profile : bash가 사용할 PATH같은 환경변수가 등록돼 있는 파일입니다.
.bash_history : bash를 통해 사용한 명령어가 기록돼 있는 파일이고
.bash_logout : 로그아웃시 bash가 실행할 명령어가 기록돼 있습니다.
이 파일들을 쉘 초기화 파일들이라고 합니다
"초기화" 라는 용어는 프로그래밍 하셨던 분들이시면 아시겠지만 모르시는 분들의 이해를 돕기 위해 쉽게 설명하자면, '초기화'란 기존의 정보를 덮어씌우는 거라 할 수 있습니다.
기존에 리눅스에 설정된 bash 쉘 설정 중 "A" 값이 있을 때, ".bash"로 시작하는 파일에 "A -> a"라는 내용이 있으면 적용되면서 bash의 설정 전체에서 "A"라는 값만 'a'로 바꾸는 거죠.
이런 메커니즘을 통해, 유저들은 쉘 초기화 파일들을 이용해 자기 입맛대로 쉘 설정을 바꾸는 겁니다.
"alias..? ", "PATH...? " ,"환경변수...?"
네..네.. 다 이 내용들도 생소하신 분들은 이해 안되실 거 압니다. 한번 차근차근 정리해 보겠습니다.
여기서 ".bash"로 시작하는 바탕화면에 숨겨진 파일들에 대해 자세히 설명해보자면
.bashrc : 리눅스 부팅시 설정해둔 함수나 alias환경변수를 bash에 적용하는 파일이고
.bash_profile : bash가 사용할 PATH같은 환경변수가 등록돼 있는 파일입니다.
.bash_history : bash를 통해 사용한 명령어가 기록돼 있는 파일이고
.bash_logout : 로그아웃시 bash가 실행할 명령어가 기록돼 있습니다.
이 파일들을 쉘 초기화 파일들이라고 합니다
"초기화" 라는 용어는 프로그래밍 하셨던 분들이시면 아시겠지만 모르시는 분들의 이해를 돕기 위해 쉽게 설명하자면, '초기화'란 기존의 정보를 덮어씌우는 거라 할 수 있습니다.
기존에 리눅스에 설정된 bash 쉘 설정 중 "A" 값이 있을 때, ".bash"로 시작하는 파일에 "A -> a"라는 내용이 있으면 적용되면서 bash의 설정 전체에서 "A"라는 값만 'a'로 바꾸는 거죠.
이런 메커니즘을 통해, 유저들은 쉘 초기화 파일들을 이용해 자기 입맛대로 쉘 설정을 바꾸는 겁니다.
"alias..? ", "PATH...? " ,"환경변수...?"
네..네.. 다 이 내용들도 생소하신 분들은 이해 안되실 거 압니다. 한번 차근차근 정리해 보겠습니다.
ii) 환경변수란, bashrc , /etc/bashrc
제일 먼저 "alias"란 명령어는 '별명'이라는 영어 뜻 그대로 별명을 붙여 어떠한 명령어를 다른 이름으로도 사용할 수 있게 해주는 명령어입니다.
예로들어 명령어 창에서 "alias tt='ls' "이런식으로 치면
'ls'를 치는 것 외에도 "tt"이란 명령어를 치면 "ls" 명령어와 같은 결과가 나오게 됩니다.
사진을 보시면
요런식으로 말이죠 위에 보시면 alias 등록하기 전엔 "tt"는 없는 명령어였지만
"alias" 명령어로 등록한 뒤엔 "ls"와 같은 명령어가 됐죠?
그리고 이러한 유저가 만든 특정 '설정 값'은 유저의 '환경'에 등록해서 언제 어디서든 가져와 사용할 수 있게 하는 '값'이라 하여 이것을 우린 '환경 변수'라고 합니다.
하지만 지금 저희가 명령어 "alias"를 통해 등록한 것은 임시적인 것입니다. 무슨소리냐?
우리가 alias tt='ls' 라고 한 입력한 값은 현재 '환경변수'로서 컴퓨터의 메모리에 올라갑니다.
하지만 여러분도 알다시피? 우리가 사용하는 메모리에 올라간 프로그램(프로세스)란 것은 컴퓨터를 종료하든, 특정 유저를 담당하는 쉘이 종료되든 메모리에서 사라지면 당연히 그 값은 사라집니다.
즉, 재부팅을 하면 지워진다 이거죠
그럼 영구적으로 'alias'와 같은 환경변수를 등록하고 싶으면 어떻게 하느냐... 바로 그 때 아까 설명한 ".bashrc"를 쓰는 겁니다! 위에서 설명했었죠!
.bashrc : 리눅스 부팅시 설정해둔 함수나 alias환경변수를 bash에 적용하는 파일
부팅시 설정해둔 함수나 "alias 환경변수"를 적용하는 파일이라 말이죠
이 ".bashrc"에 "alias 명령어"를 적는 겁니다. 그러면 이제 부팅할 때나 유저에게 쉘이 할당돼 bash가 실행될 때마다 등록한 alias가 적용되는 것이죠
이렇듯 특정 설정 값(환경변수)를 영구적으로 등록하려면, 초기화 파일에 적어서 재부팅할 때마다 적용하게 하는 방법밖에 없다는 겁니다.
사진으로 예시를 보여드릴게요
그럼 영구적으로 'alias'와 같은 환경변수를 등록하고 싶으면 어떻게 하느냐... 바로 그 때 아까 설명한 ".bashrc"를 쓰는 겁니다! 위에서 설명했었죠!
.bashrc : 리눅스 부팅시 설정해둔 함수나 alias환경변수를 bash에 적용하는 파일
부팅시 설정해둔 함수나 "alias 환경변수"를 적용하는 파일이라 말이죠
이 ".bashrc"에 "alias 명령어"를 적는 겁니다. 그러면 이제 부팅할 때나 유저에게 쉘이 할당돼 bash가 실행될 때마다 등록한 alias가 적용되는 것이죠
이렇듯 특정 설정 값(환경변수)를 영구적으로 등록하려면, 초기화 파일에 적어서 재부팅할 때마다 적용하게 하는 방법밖에 없다는 겁니다.
사진으로 예시를 보여드릴게요
사용해보면 확실히 둘다 alias가 됐습니다
자 그럼 이번엔
이렇게 아직 안배운 vi란 명령어를 이용해서 ".bashrc"를 연다음
alias tt='ls'를 써준뒤 저장하고 나오고
재부팅을 해보겠습니다.
재부팅을 한뒤 아까처럼 명령어창에 "sl"과 "tt"를 둘다
쳐봤더니 .bashrc에 등록한 "tt"만 그대로인 것을 볼 수 있습니다.
이처럼 .bashrc는 부팅시, 설정해놓은 것을 적용하는 파일이기에 재부팅 할 때마다 적용할 것을 이 파일에 적어두라는 것이죠.
하지만 저희는 홈에 있는 .bashrc에 alias를 등록했죠?
네? 홈이 뭐냐고요?
위 사진에 주황색으로 동그라미 친 "~"가 있는 장소가 여러분들도 아시다시피, 리눅스에서 현재 위치를 나타내는 곳인데요
여기에 있는 "~" 이 모양이 '현재 로그인한 유저의 home 디렉토리'와 같은 의미입니다
어쨌든 다시 돌아가서, 저희는 "root(관리자)"의 홈에 있는 ".bashrc"에 alias를 등록했기
때문에 "다른 유저"로 로그인을 하면 당연히 root에서 적용한 "alias 설정 값이 없습니다"
"root유저"의 ".bashrc"니까 그런 것이죠.
그럼 모든 유저에 alias를 적용되게 하려면 어떻게 해야할까요?
이 때 알아야 할 것이 바로
"/etc/bashrc"입니다.
각 유저 홈에 있는 .bashrc는 그 유저에게 한정돼 있다면 "/etc/bashrc"는 "모든 유저"에게 해당되죠. 왜냐하면 이 /etc 디렉토리는 모두 리눅스 시스템 전역에 적용되는 설정파일들이 모여있는 곳이기 때문입니다.
그래서 "vi란 명령어로(모르시면 리눅스 독학 페이지 -> vim 포스트를 보고 오시길 바랍니다)"란 편집에디터를 이용해 "/etc/bashrc"파일을 연 다음 맨 밑으로 이동 후 아까처럼
이렇게 써놓은 뒤 저장하고 나가
겠습니다.
그리고
다른 유저로 로그인한 뒤 (저의 경우 mamu란 유저로 로그인했습니다.)
이렇게 다시 바탕에서 오른쪽 마우스로 터미널을 열어준다음
"tt"를 치니 alias를 등록한 것 처럼 명렁어 "ls"와 같은 기능을 하는 것을 볼 수 있습니다!
iii) .bash_profile , /etc/profile, $PATH $HOME
".bash_profile"도 비슷하게
리눅스시스템 전체에 적용되는 "/etc/profile"이란 파일이 있고 한 유저에게만 적용되는
".bash_profile"이 있는데요
.bash_profile : bash가 사용할 PATH같은 환경변수가 등록돼 있는 파일입니다.
"profile"로 끝나는 파일은 아까 위에서 설명한 것 처럼 환경변수가 적혀있는 파일입니다.
'환경변수'란 것은 아까 위에서 설명했듯이 특정 프로세스 내에서 환경에 자연스럽게 존재해 사용 가능한 '전역 변수'같은 것입니다.
자세히 말하자면 실제로 전역 변수 마냥 이 '환경 변수'라는 것을 시스템에 선언하면, 메모리에 특정 부분에 몰려있습니다. 그래서 다른 프로세스들이 메모리 참조를 통해 어디서든 사용할 수 있도록 말이죠~
아까 ".bashrc"에 등록한 alias="tt" 이 값처럼 말이죠.
".bashrc"에 적은 환경변수는 한 유저에게만 영향이 있는 "사용자 환경변수"라 할 수 있고
"/etc/bashrc"에 적은 alias="tt"처럼 /etc/에 있는 설정파일에 적은 환경변수는
모든 유저에게 적용되는 "시스템 전체 환경 변수"라고 할 수 있습니다.
어?
"bash_profile"이 bash에서의 환경변수가 적혀있는 파일인데 "bashrc"도 bash의 환경변수가 적혀있는 파일 이라고요?
그럼 bash_profile과 bashrc는 뭐가 다르죠??????
사실 기능적으로 보면 큰 차이는 없지만, "/etc/profile"을 열어보시면
영어로, 로그인 했을 때를 위한 시스템의 전반적인 환경변수와 스타트업 프로그램
들은 /etc/profile에 적고,
함수나 alias(아까 한 치환같은 것)은 /etc/bashrc에 적어달라고 적혀있습니다
또 이번엔 "/etc/bashrc" 파일을 열어보시면
이렇게 시스템 전역 함수나 alias들을 적어주고
환경변수 같은 것들은 /etc/profile에 적어달라고 하고 있죠
결론은 효율이나 코드의 모듈화를 위해서 따로 분리해서 적어달라고 개발자?가 요구했기에 그렇게 분리하여 적는 다는 것이죠.
그래서 중간 정리를 하자면
"bashrc"로 끝나는 "/etc/bashrc" , ".bashrc"에는 시스템 전역함수나 alias를 적고
"profile"로 끝나는 "/etc/profile" , ".bash_profile"에는 alias를 제외한 환경변수와 스타트업
프로그램을 적는겁니다.
그리고 위에서 언급해왔듯 시스템 전체 모든 유저에게 적용시키고 싶으면 /etc/에 있는 곳에 적어라인겁니다.
하하.. 아마 아직까진 profile에 적는 환경변수란 것에 대해 정확히 이해가 잘 안되시죠?
"PATH"란 환경변수 예시를 통해 좀 더 설명해볼게요
.bash_profile 을 vi로 열어보면 이렇게 나올텐데요
주황색 동그라미를 보시면
"export"란 명령어는 환경변수를 선언하는 명령어입니다. 그 뒤에 PATH를 쓰면
이제 "PATH"는 환경변수가 된거죠 하지만 여기서 선언한 "PATH"는
이 .bash_profile이 있는 현재 로그인한 "유저"만 사용하는 환경변수 "PATH"입니다
그리고 보라색 동그라미 안을 보시면 "PATH=$PATH:$HOME/bin" 이렇게 있을 텐데요
여기서 "맨앞의" PATH는 바로 여기서 선언한 새로 적용하는 "유저의" 환경변수 PATH고
"=" 는 프로그래밍을 배웠던 분들은 다 아시는 우항의 내용을 좌항에 넣는다는 뜻입니다. 여기서의 우항은 "$PATH:$HOME/bin"겠죠
그리고
$변수 $는 뒤에 붙은 변수(환경변수)의 값을 불러올 때 쓰는 기호입니다 그러니
$PATH와 $HOME은 PATH란 환경변수의 값과 HOME이란 환경변수의 값을 불러내는 거죠
여기서 머지? 이 .bash_profile에서 HOME은 선언한 적이 없는데? 또, $PATH는 머지? 자기 스스로를 다시 사용하는 재귀인가? 와 같은 의문이 생기실 텐데요
이 우항에 쓰인 $PATH와 $HOME의 PATH와 HOME은 리눅스 전체 시스템에 기본으로 설정돼 있는 환경변수입니다.
$PATH에 쓰인 PATH값은 리눅스 전체 시스템에 기본적으로 설정된 PATH 환경변수(명령어를 찾는 위치)들이 들어 있고
$HOME예 쓰인 HOME값은 현재 로그인한 유저의 홈 디렉토리 경로가 들어있습니다, 여기서 우린 root로 로그인하고 있으니, HOME값은 '/root'가 되겠죠
그래서 정리하자면
좌항의 PATH(현재 로그인한 유저만의 PATH)와 우항의 PATH(시스템에 디폴트로 되어 있는 PATH)는 다르며 제가 root로 접속하면서 .bash_profile이 실행되면, 이 파일안에 있는
PATH=$PATH:$HOME/bin란 코드에 의해
로그인한 유저, 즉 root의 PATH 환경변수의 값은
시스템의 디폴트 PATH 환경변수 값 + /root/bin가 되어
값이
이렇게 나오게 되는겁니다.
아직 안배웠지만 "echo"란 명령어는 뒤에 쓴 것을 출력하는 명령어인데요
즉 echo(출력해라) $PATH(PATH환경변수의 값) 이란 뜻이죠
출력된 내용을 보시면
/usr/local/bin:/usr/local/sbin:/usr/bin:.... 이렇게 ":"로 구분돼 있는걸 볼 수 있습니다.
이게 무슨의미냐면
저희가 ls, cat , 등등 리눅스의 명령어를 치면 이 명령어들을 /usr/local/bin이란 디렉토리에서 먼저 찾고 거기서 못찾으면 그다음
/usr/local/sbin이란 디렉토리에서 찾고 거기서도 못 찾으면 그다음
/usr/bin에서 찾고 거기서도 못찾으면 그 다음...
이런 순서로 명령어가 있는 디렉토리를 찾으라는 겁니다.
전에 말했죠? 리눅스는 모든 것을 "파일"로 다룬다고, 그래서
명령어도 파일형태로 존재하기 때문에 명령어 파일의 위치를 쉘에게 알려줄 PATH 환경변수는 꼭 필요한겁니다.
여기서 리눅스에 기본으로 설정 돼 있다는 이 "PATH"와 "HOME" 환경변수가 선언된
스크립트 위치는 어디냐?? 라 깊은 궁금증을 가진 분들이 있으실 텐데요
이건 너무 어렵습니다. 분명 리눅스 시스템에 관련된 파일들중 어딘가에 있을 텐데요
제 추측은 /etc/rc.d/라는 디렉토리 안 어딘가에 있을 것 같습니다.
PATH변수는 제가 /etc/rc.d/init.d에 있다는 걸 발견했습니다 그런데
HOME은 어딨는지 모르겠어요...
/etc/rc.d/init.d/functions파일의 PATH변수
그런데 저희가 아까 echo $PATH했을 땐
이렇게 나왔었는데
기본 PATH환경변수 순서대로면 root아이디에서 echo $PATH 했을 때
/sbin:/usr/sbin:/bin:/usr/bin:/root/bin 이렇게 됐어야 할 텐데, 값이 다릅니다.
그 이유는 최초의 PATH환경 변수가 각 유저의 .bash_profile파일 이전에 또 다른 파일들에 의해 바뀌게 돼서 그런겁니다.
그 파일들 중 하나 /etc/profile 파일 내의 함수 pathmunge()와 if문이 있는데요
밑에를 보시면
와
와 같이 여러 스크립트의 함수를 거쳐
실제 PATH 환경변수의 값은
요렇게 바뀌게 된 겁니다.
자 그럼 이제 .bashrc와 .bash_profile을 알았으니 나머지
".bash_history"와 ".bash_logout"을 알아볼까요
".bash_history"란 말 그대로 history를 기억하는 파일입니다
전 포스팅에서 저희가 지금까지 친 명령어 보여주는 "history 명령어"를 알려줬엇죠?
그것이 가능할 수 있었던 이유가 바로 이 ".bash_history"파일 덕분입니다.
".bash_history"는 유저가 접속할 동안 입력한 명령어들을 유저가 접속을 종료할 때 저장합니다.
그리고 다시 리눅스 접속(bash가 실행될 때)할 때 ".bash_history"에서 저장했었던 명령어 기록들을 다시 불러오는 겁니다.
사진으로 보여드리면
이렇게 history를 치면 지금까지 쳐왔던 기록이 나오는데요
history -c 란 명령어로 history를 전부 지우고 나서
이렇게 .bash_history파일을 열어보니 지우기 전의 history가 그대로 있습니다.
.bash_history는 history명령어와 같지 않다는 것을 알 수 있고
로그아웃 한다음 다시 접속해서
history를 다시 쳐보면
이렇게 그대로 .bash_history 에서 불러온 걸 알 수 있습니다.
그리고
"history"명령어를 친뒤 맨 밑을 보면 아까 history 명령어 목록을 지운뒤 확인용으로 썻던 "history"명령어와 "cat .bash_history"명령어가 보입니다 (다른 명령어들은 저의 뻘짓입니다 .. 하핳)
이로써 종료할 때 우리가 쳤던 명령어들은 ".bash_history"에 저장된다는 걸 알 수 있습니다.
그럼 완전히 history를 지우는 방법은 뭘까요
당연히 ".bash_history" 파일의 내용을 지우면 될 겁니다.
이렇게 아~무것도 안들어 있는 "/dev/null"이란 파일의 내용을 ">"를 이용해 ".bash_history"파일에 덮어씌우면서
".bash_history"파일엔 아무것도 안들어있게 되는거죠
물론 이 방법말고도 지우는 방법은 매우 많습니다~
"/dev/null"이 아닌 자신이 새로 "touch"명령으로 만든 파일을 ">"로 뒤집어 씌어도 같은 결과겠죠
".bash_logout"파일은 사실 있어도 그만, 없어도 그만인 파일인데요
보통 로그아웃을 할 때 실행됐으면 하는 과정이 있을 때 쓰이는 파일입니다
예로들어 이 파일에 ".bash_history 기록을 지우라는 명령어"를 적어놓으면
유저가 로그아웃할 때 기록을 지우는거죠
vi) /etc/profile , .bash_profile , .bashrc , /etc/bashrc 순서
.bashrc
/etc/bashrc
.bash_profile
/etc/profile
.bash_logout
.bash_history
에 대해 알아보았는데요 그럼 이것들이 켜지는 순서는 어떻게 될까요?
결론적으로 말하자면 순서는
/etc/profile -> .bash_profile -> .bashrc -> /etc/bashrc ->.bash_history
순 입니다.
먼저 "/etc/profile"이 "/etc/profile.d/"라는 디렉토리안에 있는 모든
"sh파일들"을 시작하고
그다음
".bash_profile"이 ".bashrc"를 시작하고
".bashrc"가 "/etc/bashrc"를 시작합니다
그리고 ".bash_logout"은 아까 설명했다싶이 로그아웃할 때 실행이 되니 젤 마지막이겠죠?
1. 쉘이란 명령어를 해석해주는 번역가 같은 것이고 그렇기에 'chsh -s [쉘 명령어 경로]'으로 변경이 가능하며, 우리가 주로 쓰는 운영체제의 쉘은 bash다
2. alias나 전역함수를 개인에게 등록하고 싶으면 .bashrc에 , 모든 유저에게 적용하고 싶으면 /etc/bashrc에
3. 환경변수나 스타트업 프로그램을 개인에게 등록하고 싶으면 .bash_profile에 , 모든 유저에게 적용하고 싶으면 /etc/profile에
4. 명령어 history는 .bash_history에서 명령어 기록을 가져오고 , .bash_history는 친 명령어들을 로그아웃할 때 기록한다
5. .bash_logout은 말 그대로 로그아웃할 때 실행되는 스크립트다.
6. bash에 관련된 초기화 파일들의 실행 순서는 /etc/profile -> .bash_profile -> .bashrc
-> /etc/bashrc ->.bash_logout 순이다
7. '$환경변수'에서 '$'는 리눅스에서 환경변수의 값을 가져오는 특수기호며, PATH는 명령어를 찾는 디렉토리 순서가 적힌 환경변수, HOME은 유저의 홈 디렉토리 경로가 적힌 환겨변수다.
로그인한 유저, 즉 root의 PATH 환경변수의 값은
시스템의 디폴트 PATH 환경변수 값 + /root/bin가 되어
값이
이렇게 나오게 되는겁니다.
아직 안배웠지만 "echo"란 명령어는 뒤에 쓴 것을 출력하는 명령어인데요
즉 echo(출력해라) $PATH(PATH환경변수의 값) 이란 뜻이죠
출력된 내용을 보시면
/usr/local/bin:/usr/local/sbin:/usr/bin:.... 이렇게 ":"로 구분돼 있는걸 볼 수 있습니다.
이게 무슨의미냐면
저희가 ls, cat , 등등 리눅스의 명령어를 치면 이 명령어들을 /usr/local/bin이란 디렉토리에서 먼저 찾고 거기서 못찾으면 그다음
/usr/local/sbin이란 디렉토리에서 찾고 거기서도 못 찾으면 그다음
/usr/bin에서 찾고 거기서도 못찾으면 그 다음...
이런 순서로 명령어가 있는 디렉토리를 찾으라는 겁니다.
전에 말했죠? 리눅스는 모든 것을 "파일"로 다룬다고, 그래서
명령어도 파일형태로 존재하기 때문에 명령어 파일의 위치를 쉘에게 알려줄 PATH 환경변수는 꼭 필요한겁니다.
여기서 리눅스에 기본으로 설정 돼 있다는 이 "PATH"와 "HOME" 환경변수가 선언된
스크립트 위치는 어디냐?? 라 깊은 궁금증을 가진 분들이 있으실 텐데요
이건 너무 어렵습니다. 분명 리눅스 시스템에 관련된 파일들중 어딘가에 있을 텐데요
제 추측은 /etc/rc.d/라는 디렉토리 안 어딘가에 있을 것 같습니다.
PATH변수는 제가 /etc/rc.d/init.d에 있다는 걸 발견했습니다 그런데
HOME은 어딨는지 모르겠어요...
/etc/rc.d/init.d/functions파일의 PATH변수
그런데 저희가 아까 echo $PATH했을 땐
echo $PATH값
이렇게 나왔었는데
기본 PATH환경변수 순서대로면 root아이디에서 echo $PATH 했을 때
/sbin:/usr/sbin:/bin:/usr/bin:/root/bin 이렇게 됐어야 할 텐데, 값이 다릅니다.
그 이유는 최초의 PATH환경 변수가 각 유저의 .bash_profile파일 이전에 또 다른 파일들에 의해 바뀌게 돼서 그런겁니다.
그 파일들 중 하나 /etc/profile 파일 내의 함수 pathmunge()와 if문이 있는데요
밑에를 보시면
와
와 같이 여러 스크립트의 함수를 거쳐
실제 PATH 환경변수의 값은
요렇게 바뀌게 된 겁니다.
iv) .bash_history
".bash_history"와 ".bash_logout"을 알아볼까요
".bash_history"란 말 그대로 history를 기억하는 파일입니다
전 포스팅에서 저희가 지금까지 친 명령어 보여주는 "history 명령어"를 알려줬엇죠?
그것이 가능할 수 있었던 이유가 바로 이 ".bash_history"파일 덕분입니다.
".bash_history"는 유저가 접속할 동안 입력한 명령어들을 유저가 접속을 종료할 때 저장합니다.
그리고 다시 리눅스 접속(bash가 실행될 때)할 때 ".bash_history"에서 저장했었던 명령어 기록들을 다시 불러오는 겁니다.
사진으로 보여드리면
이렇게 history를 치면 지금까지 쳐왔던 기록이 나오는데요
history -c 란 명령어로 history를 전부 지우고 나서
이렇게 .bash_history파일을 열어보니 지우기 전의 history가 그대로 있습니다.
.bash_history는 history명령어와 같지 않다는 것을 알 수 있고
로그아웃 한다음 다시 접속해서
history를 다시 쳐보면
이렇게 그대로 .bash_history 에서 불러온 걸 알 수 있습니다.
그리고
"history"명령어를 친뒤 맨 밑을 보면 아까 history 명령어 목록을 지운뒤 확인용으로 썻던 "history"명령어와 "cat .bash_history"명령어가 보입니다 (다른 명령어들은 저의 뻘짓입니다 .. 하핳)
이로써 종료할 때 우리가 쳤던 명령어들은 ".bash_history"에 저장된다는 걸 알 수 있습니다.
그럼 완전히 history를 지우는 방법은 뭘까요
당연히 ".bash_history" 파일의 내용을 지우면 될 겁니다.
이렇게 아~무것도 안들어 있는 "/dev/null"이란 파일의 내용을 ">"를 이용해 ".bash_history"파일에 덮어씌우면서
".bash_history"파일엔 아무것도 안들어있게 되는거죠
물론 이 방법말고도 지우는 방법은 매우 많습니다~
"/dev/null"이 아닌 자신이 새로 "touch"명령으로 만든 파일을 ">"로 뒤집어 씌어도 같은 결과겠죠
v) .bash_logout
".bash_logout"파일은 사실 있어도 그만, 없어도 그만인 파일인데요
보통 로그아웃을 할 때 실행됐으면 하는 과정이 있을 때 쓰이는 파일입니다
예로들어 이 파일에 ".bash_history 기록을 지우라는 명령어"를 적어놓으면
유저가 로그아웃할 때 기록을 지우는거죠
vi) /etc/profile , .bash_profile , .bashrc , /etc/bashrc 순서
.bashrc
/etc/bashrc
.bash_profile
/etc/profile
.bash_logout
.bash_history
에 대해 알아보았는데요 그럼 이것들이 켜지는 순서는 어떻게 될까요?
결론적으로 말하자면 순서는
/etc/profile -> .bash_profile -> .bashrc -> /etc/bashrc ->.bash_history
순 입니다.
먼저 "/etc/profile"이 "/etc/profile.d/"라는 디렉토리안에 있는 모든
"sh파일들"을 시작하고
그다음
".bash_profile"이 ".bashrc"를 시작하고
".bashrc"가 "/etc/bashrc"를 시작합니다
그리고 ".bash_logout"은 아까 설명했다싶이 로그아웃할 때 실행이 되니 젤 마지막이겠죠?
vii) 총 정리
1. 쉘이란 명령어를 해석해주는 번역가 같은 것이고 그렇기에 'chsh -s [쉘 명령어 경로]'으로 변경이 가능하며, 우리가 주로 쓰는 운영체제의 쉘은 bash다
2. alias나 전역함수를 개인에게 등록하고 싶으면 .bashrc에 , 모든 유저에게 적용하고 싶으면 /etc/bashrc에
3. 환경변수나 스타트업 프로그램을 개인에게 등록하고 싶으면 .bash_profile에 , 모든 유저에게 적용하고 싶으면 /etc/profile에
4. 명령어 history는 .bash_history에서 명령어 기록을 가져오고 , .bash_history는 친 명령어들을 로그아웃할 때 기록한다
5. .bash_logout은 말 그대로 로그아웃할 때 실행되는 스크립트다.
6. bash에 관련된 초기화 파일들의 실행 순서는 /etc/profile -> .bash_profile -> .bashrc
-> /etc/bashrc ->.bash_logout 순이다
7. '$환경변수'에서 '$'는 리눅스에서 환경변수의 값을 가져오는 특수기호며, PATH는 명령어를 찾는 디렉토리 순서가 적힌 환경변수, HOME은 유저의 홈 디렉토리 경로가 적힌 환겨변수다.
8. 실제로 환경변수는 전역변수 마냥 메모리 특수 공간에 몰려서 저장돼, 같은 환경의 프로세스가 참조해서 이용할 수 있게 하는 것이다.
9. echo "내용" 에서 echo 명령어는 뒤에 적은 내용을 출력하는 명령어다
와... 진짜 정리하는데 16시간 이상 쓴 것 같아요... 너무 힘드네요 ㅠ
오타나 틀린점, 부족한 점이 발견시 댓글도 알려주시면 바로 수정하겠습니다!
꼭 도움이 되는 분들이 있으시면 좋겠습니다 ㅠ 도움이 되셨다면
팔로우 부탁드립니다! 저에게 큰 힘이 됩니다!
# Update 24-05-31
9. echo "내용" 에서 echo 명령어는 뒤에 적은 내용을 출력하는 명령어다
와... 진짜 정리하는데 16시간 이상 쓴 것 같아요... 너무 힘드네요 ㅠ
오타나 틀린점, 부족한 점이 발견시 댓글도 알려주시면 바로 수정하겠습니다!
꼭 도움이 되는 분들이 있으시면 좋겠습니다 ㅠ 도움이 되셨다면
팔로우 부탁드립니다! 저에게 큰 힘이 됩니다!
# Update 24-05-31
공부 중인데 도움 많이 되었습니다.
답글삭제도움이 돼 다행입니다!
삭제정말 많은 도움이 되었습니다!!!! 감사합니다!!!!
답글삭제도움이 돼 다행입니다!!! 따뜻한 댓글 감사해요~!
삭제감탄이 나오는 정리입니다... 정말 감사합니다!
답글삭제도움이 돼 정말 다행입니다! 따뜻한 댓글 감사합니다~~
삭제