쉘에 대한 이해 4
쉘에 대한 이해 3에 이어서 진행하겠습니다.
사용자별 쉘 설정파일(쉘 스크립트)
/etc/skel/ 경로로 들어가면 .bash_logout과 .bash_profile .bashrc 쉘 스크립트가있습니다.
모든 사용자들은 생성될때 이 3가지 설정파일들을 /etc/skel/에서 자신의 홈디렉터리로 복사하게 됩니다.
따라서 모든 사용자들이 갖고 있습니다.
이 쉘 스크립트를 이용해 전체 사용자들에게 동일한 설정을 적용시키려면 밑에있는 경로에 설정파일을 변경해주면 됩니다.
(단, 이미 생성되어있는 사용자는 변경되지 않습니다.)
- /etc/skel .bash_logout
- /etc/skel .bash_profile
- /etc/skel .bashrc
사용자별로 설정을 바꾸고 싶을때에는 각 사용자들의 홈디렉터리에 있는 설정파일을 변경해주면 됩니다.
- $HOME/ .bash_logout
- $HOME/ .bash_profile
- $HOME/ .bashrc
- .bash_logout : 사용자가 로그아웃할 때 자동으로 실행되는 스크립트
- .bash_profile : 사용자가 로그인할 때 자동으로 실행되는 스크립트
- .bashrc : 로그인할때 실행되는 스크립트
.bash_profile과 .bashrc는 로그인쉘입니다. 둘 다 사용자가 로그인할 때 실행되는 쉘입니다.
.bash_profile의 내용을 보면 환경변수를 볼 수 있습니다. 또한 로그인 될 때 실행되기 때문에 바꿀 수 있는 프롬프트 모양을 바꿀때 매번 바꾸기 보다는 .bash_profile에 저장해 로그인이 실행되면 알아서 바꿀 수 있게 만들 수 있습니다.
.bashrc는 .bash_profile과 마찬가지로 로그인이 실행될때 실행됩니다. root 권한의 .bashrc에서만 alias 설정이 되어있습니다. 다른 일반 사용자에게는 alias 설정이 되어있지 않습니다.
그러면 어떤 차이인가?
su 명령어를 통해서 확인해 볼 수 있습니다.
먼저 su 명령어를 살펴보면
switch user : su
su 옵션중에서 su 와 su - 의 차이를 통해 .bashrc 와 .bash_profile의 차이를 볼 수 있습니다.
su user1 : 기존에 사용했던 쉘을 이용해서 쓴다. (서브쉘) - run bashrc
su - user1 : 전혀 다른 쉘. 로그인쉘 - run bashrc , run bash_profile
예를 들어 user1에 홈디렉터리 안에 있는 .bashrc와 .bash_profile 내에 각각 "run bashrc"와 "run bash_profile"을 추가해주었습니다.
su 명령어를 통해 user1이 로그인되면 쉘스크립트가 작동되는지 확인하기 위해서 추가했습니다.
밑에는 echo 명령어로 추가된 것을 볼 수 있습니다.
그리고 나서 su user1과 su - user1을 사용해보았습니다.
su user1에 경우에는 .bashrc만 실행되었다는 것을 확인해 볼 수 있습니다. 여기서 env라는 환경변수 목록을 확인하는 명령을 통해 현재 PATH를 확인해 보았습니다.
user1으로 변경했음에도 불구하고 쉘이 root로 실행되고 있다는 것을 볼 수 있습니다. (서브쉘)
su - user1 에 경우에는 .bashrc와 .bash_profile 둘 다 실행되었다는 것을 알 수 있습니다. 마찬가지로 env 명령어를 통해 PATH를 확인해 보았더니 user1의 쉘을 이용하고 있다는 것을 확인해볼 수 있습니다. 사용자를 변경했어도 root쉘을 사용하지않고 터미널에서와 같이 사용자의 쉘을 사용하고 있는 것을 볼 수 있습니다.
.bash_history : 로그인한 쉘의 명령어들의 목록을 보여준다.
사용자가 로그인하면 썼던 명령어들을 .bash_history로 저장하게 됩니다. 로그아웃되었을 때 자동으로 만들어지고, 로그인 안한 사용자의 경우에는 생성되지 않습니다.
기본 설정으로는 1000개이상 저장되지 않습니다. set 명령을 통해 바꿔줄 수 있습니다. 만약 바꿀때에는 꼭 .bash_profile에 저장해야 합니다.
history : 사용했던 명령어 확인 - .bash_history로 저장되기 전에 메모리에 저장되는데 여기서 확인할 수 있습니다.
!! : 가장 최근에 실행되었던 명령어를 실행
!vi : 가장 최근에 실행되었던 vi 로 시작되는 명령어를 실행
!200 : history에 있는 200번의 명령어를 실행
다중 명령어 ; && || |
- 한번에 두 개 이상의 명령을 수행
- 순서대로 처리
ex) 같이 실행시키고 싶을 때 사용.
cd /tmp touch file1 cd ~ 이 세가지 명령을 한 줄에 사용하고 싶을때 다중 명령어를 사용한다.
- cd /tmp ; touch file1 ; cd ~
; 는 앞에 명령어가 뒤에 명령어에 영향을 미치지 않음.
만약 cd/ temp ; touch file1 ; cd ~ 으로 앞에 명령어를 실패하면 두번째 명령과 세번째 명령은 실행된다.
- cd /tmp && touch file1 && cd ~
&& - and
만약 cd/ temp && touch file1 && cd ~ 으로 첫번째가 명령이 실패되었으므로 전체가 다 실행이 안된다.
- cd /tmp || touch file1 || cd ~
|| - or 첫번째 것만 실행되고 나머지는 실행 X
만약 cd/ temp || touch file1 || cd ~ 으로 첫번째 명령이 실패되었으면 두번째 명령이 실행되고 세번째 명령은 실행되지 않는다.
|
- 이전 명령어의 표준 출력을 다음 명령어의 표준 입력으로 전달
ex) cmd1 | cmd2 | cmd3 | cmd4 ...
cat | awk
awk 명령을 통해서 | 를 확인해보려 한다.
기본적으로 awk 명령은 gawk -F: '{ print $1 }' /etc/passwd 사용한다.
/etc/passwd 파일을 : 로 나누고 앞에 첫번째 부분을 출력하라는 의미이다.
이것을 다중명령어인 | 를 이용해 cat /etc/passwd | gawk -F: '{ print $1 }' 사용할 수도 있다.
또다른 예제로는 ps -ef | gawk -F' ' '{ print $1 }' cat - | gawk -F: '{ print $1 }' 가 있다.