- 셸은 Bourne 계열(sh·ksh·bash·zsh·dash) 과 C 계열(csh·tcsh) 둘뿐이다. c가 들어간 둘만 C 계열이다.
- 셸 변수는 현재 셸까지, 환경 변수는 자식까지. 승격 명령이
export다. - 로그인 셸은
.bash_profile, 비로그인 셸은.bashrc를 읽는다. >는 덮어쓰기>>는 이어쓰기, 에러는 2번 통로다.- 설정 즉시 반영은
source, 별칭 해제는unalias.
기준: 리눅스마스터 2급 출제 기준오류 제보
export 다..bash_profile, 비로그인 셸은 .bashrc 를 읽는다.>는 덮어쓰기 >>는 이어쓰기, 에러는 2번 통로다.source, 별칭 해제는 unalias. 셸의 갈래
Bourne 계열 sh(Bourne) · ksh(Korn) · bash(Fox) · zsh · dash
C 계열 csh(Joy) · tcsh ← 이 둘만!
변수
NAME=값 셸 변수 → set 으로 확인 (현재 셸까지)
export NAME=값 환경 변수 → env 으로 확인 (자식까지)
설정 파일
로그인 /etc/profile → ~/.bash_profile → (~/.bashrc 호출)
비로그인 ~/.bashrc
로그아웃 ~/.bash_logout
즉시적용 source 파일 또는 . 파일
입출력
0 stdin <
1 stdout > >> &> 둘 다
2 stderr 2> 2>> 2> /dev/null 버리기
파이프 명령 | 명령
편의
alias / unalias 별칭
history · !! · !번호 이력나흘 동안 따로 배운 것들은 사실 셸이 하루 동안 하는 일의 순서다.
① 접속 /etc/passwd 의 7번째 필드를 보고 /bin/bash 를 로그인 셸로 띄운다
② 설정 읽기 /etc/profile → ~/.bash_profile → ~/.bashrc → /etc/bashrc
③ 변수 준비 PATH · HOME · PS1 같은 변수가 채워진다
④ 프롬프트 PS1 모양대로 [user@server1 ~]$ 를 띄우고 입력을 기다린다
⑤ 명령 입력 ll *.log > out.txt 2> err.txt
⑥ 해석 ll → ls -l (별칭) · *.log → 파일 이름들 (와일드카드) · > 와 2> 연결
⑦ 실행 PATH 에서 ls 를 찾아 자식 프로세스로 실행하고 끝나기를 기다린다
⑧ 결과 종료 상태를 $? 에 담고 다시 프롬프트를 띄운다
⑨ 로그아웃 ~/.bash_logout 을 실행하고 이력을 ~/.bash_history 에 남긴다| 단계 | 배운 날 | 그 단계에서 나오는 문제 |
|---|---|---|
| ① | Day 1 | 로그인 셸은 어디에 적혀 있나, 어떻게 바꾸나 |
| ②·⑨ | Day 3 | 어떤 파일을 어떤 순서로 읽나 |
| ③·④·⑧ | Day 2 | 셸 변수와 환경 변수, PATH, PS1, $? |
| ⑤·⑥ | Day 4 | 리다이렉션, 파이프, 와일드카드, 별칭 |
| ⑦ | Day 1·2 | 내부 명령과 외부 명령, PATH 검색 순서 |
ls는 이미 다 풀린 결과만 받는다..bashrc와 /etc/bashrc는 bash가 저절로 읽는 것이 아니라 앞 파일 안의 한 줄이 불러 준다(레드햇 계열 기준).| 증상 | 원인 | 해결 |
|---|---|---|
/etc/profile에 변수를 추가했는데 접속해 있던 사용자에게 안 보인다 | 설정 파일은 로그인할 때 읽힌다 | 다시 로그인하거나 source /etc/profile |
MYDIR=/data 를 만들었는데 bash backup.sh 안에서 비어 있다 | 셸 변수라 자식에게 가지 않았다 | export MYDIR |
ls > list.txt 를 했더니 어제 내용이 사라졌다 | >는 먼저 비우고 쓴다 | >> 를 쓴다 |
find / -name core > r.txt 인데 화면에 Permission denied가 쏟아진다 | 에러는 2번 통로라 >에 안 잡힌다 | 2> /dev/null 을 붙인다 |
chsh -s /bin/zsh 를 했는데 echo $SHELL 이 그대로다 | 다음 로그인부터 적용된다 | 다시 로그인 |
su 로 root가 됐는데 자리와 환경이 그대로다 | 하이픈이 없어 비로그인 셸이다 | su - |
~/.bashrc에 별칭을 적었는데 command not found 다 | 지금 셸은 고치기 전 파일을 읽은 상태다 | source ~/.bashrc |
눈앞에 있는 run.sh 를 이름만 쳤더니 command not found 다 | 현재 디렉터리는 PATH에 없다 | ./run.sh |
PATH를 고친 뒤 ls도 안 된다 | $PATH를 빼고 덮어썼다 | export PATH=/usr/bin:/bin 으로 되살린다 |
echo '$HOME' 이 $HOME 그대로 나온다 | 작은따옴표는 변수를 풀지 않는다 | 큰따옴표로 바꾼다 |
ls /etc /nodir 은 결과와 에러를 둘 다 내는 명령이다. 표기마다 무엇이 어디로 가는지 따라가 본다.
| 명령 | 화면에 보이는 것 | 파일에 담기는 것 |
|---|---|---|
ls /etc /nodir > a | 에러 | 결과 |
ls /etc /nodir 2> a | 결과 | 에러 |
ls /etc /nodir > a 2> b | 없음 | a에 결과, b에 에러 |
ls /etc /nodir &> a | 없음 | 결과와 에러 |
ls /etc /nodir > a 2>&1 | 없음 | 결과와 에러 |
ls /etc /nodir 2>&1 > a | 에러 | 결과 |
ls /etc /nodir 2> /dev/null | 결과 | 없음 (에러는 버려진다) |
ls /etc /nodir | wc -l | 에러와 줄 수 | — (파이프는 1번만 넘긴다) |
| 기호 | 뜻 | 기호 | 뜻 |
|---|---|---|---|
" " | 변수를 푼다 | ' ' | 변수를 안 푼다 |
` ` · $( ) | 명령 실행 결과 | \ | 뒤 한 글자의 특수한 뜻 제거 |
; | 무조건 이어서 | && | 앞이 성공하면 |
|| | 앞이 실패하면 | & | 백그라운드로 |
* | 글자 몇 개든 | ? | 한 글자 |
[abc] | 그중 한 글자 | [!abc] | 그것이 아닌 한 글자 |
!! | 직전 명령 전체 | !$ | 직전 명령의 마지막 인자 |
$? | 직전 명령의 종료 상태 | $$ | 현재 셸의 PID |
| 구분 | A | B | 가르는 기준 |
|---|---|---|---|
| Bourne vs C 계열 | sh·ksh·bash·zsh·dash | csh·tcsh | 이름에 c가 있나 |
| 셸 변수 vs 환경 변수 | 현재 셸까지 | 자식까지 | export 했나 |
set vs env | 전부 | 환경 변수만 | 범위 |
.bash_profile vs .bashrc | 로그인 셸 | 비로그인 셸 | 로그인 과정 여부 |
.bash_profile vs .profile | bash 전용 | 없을 때 대신 | 우선순위 |
su vs su - | 비로그인 | 로그인 셸 | 하이픈 유무 |
> vs >> | 덮어씀 | 이어 붙임 | 기존 내용 보존 |
> vs 2> | 표준 출력 | 표준 에러 | 통로 번호 |
> vs | | 파일로 | 다음 명령으로 | 넘기는 대상 |
* vs ? | 글자 수 제한 없음 | 한 글자 | 개수 |
source vs bash | 현재 셸에 반영 | 새 셸에서 끝남 | 어디서 실행되나 |
alias vs unalias | 만들기 | 지우기 | — |
$SHELL vs $0 | 로그인 셸 | 지금 실행 중인 셸 | 시점 |
NAME = linux → 등호 양옆에 공백을 넣으면 안 된다. NAME=linux.$를 붙인다 → 아니다. 꺼낼 때만 붙인다.env가 전부 보여 준다 → 아니다. set이 전부, env는 환경 변수만이다.:) 이다. 세미콜론은 윈도다.export PATH=/opt/bin → 기존 경로가 날아간다. $PATH: 를 반드시 포함한다.$?가 1이면 성공 → 0이 성공이다./etc/profile을 읽는다 → 읽지 않는다. 비로그인 셸은 .bashrc만 읽는다.source 로 다시 읽거나 재로그인해야 한다.>로 에러도 저장된다 → 아니다. 에러는 2> 로 따로 돌린다.unset으로 지운다 → unalias 다. unset은 변수용이다.$SHELL이 지금 실행 중인 셸이다 → 로그인 셸이다. 지금 것은 echo $0 이나 ps -p $$ 로 본다.> a 2>&1 과 2>&1 > a 는 같다 → 다르다. 뒤의 것은 에러가 화면에 남는다..bash_logout은 터미널 창을 닫을 때마다 실행된다 → 로그인 셸을 나올 때만이다.. file 과 ./file 은 같다 → 앞은 현재 셸에서 읽기(source), 뒤는 실행이다./sbin/nologin은 계정을 지운 것이다 → 계정은 그대로이고 로그인만 막는다.| 값 | 무엇 |
|---|---|
| 0 / 1 / 2 | 표준 입력 / 표준 출력 / 표준 에러 |
: | PATH의 구분자 |
| 7번째 | /etc/passwd에서 로그인 셸이 있는 필드 |
/etc/shells | 사용 가능한 셸 목록 파일 |
/dev/null | 버리는 곳 |
| 0 | $?에서 성공을 뜻하는 값 |
| 셸 | 만든 사람 |
|---|---|
| sh | Stephen Bourne |
| csh | Bill Joy |
| ksh | David Korn |
| bash | Brian Fox |
| 파일 | 한 줄 역할 |
|---|---|
/etc/passwd | 계정 정보. 7번째 필드가 로그인 셸 |
/etc/shells | 로그인 셸로 쓸 수 있는 셸의 목록 |
/etc/profile | 전역 · 로그인 설정 |
/etc/profile.d/ | 전역 로그인 설정을 나눠 담는 디렉터리 |
/etc/bashrc | 전역 · 셸을 띄울 때 설정 (데비안 계열은 /etc/bash.bashrc) |
~/.bash_profile | 개인 · 로그인 설정. 환경 변수를 둔다 |
~/.bashrc | 개인 · 셸을 띄울 때 설정. 별칭을 둔다 |
~/.bash_logout | 로그아웃할 때 실행 |
~/.bash_history | 명령 이력 저장 |
/etc/skel/ | 새 계정의 홈으로 복사되는 기본 설정 파일 |
/dev/null | 버리는 곳 |
| 명령 | 한 줄 역할 |
|---|---|
chsh -s | 로그인 셸 변경 |
export | 셸 변수 → 환경 변수 |
set / env | 변수 전부 / 환경 변수만 보기 |
unset | 변수 삭제 |
source (.) | 파일을 현재 셸에서 읽기 |
alias / unalias | 별칭 만들기 / 지우기 |
history | 명령 이력 보기 |
type / which | 명령의 정체 / PATH에서 찾은 위치 |
다음 주는 에디터와 프로세스다. vi 의 세 가지 모드와
ps·kill같은 프로세스 명령을 다룬다.
export : 셸 변수를 환경 변수로 승격시키는 명령.source : 설정 파일을 현재 셸에서 다시 읽는 명령. 점(.)과 같다./dev/null : 보낸 데이터를 버리는 특수 파일.선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
다음 중 Bourne 셸 계열에 속하지 않는 셸로 알맞은 것은?
문제 2
다음 중 셸 변수와 환경 변수를 모두 출력하는 명령으로 알맞은 것은?
문제 3
다음 중 명령의 표준 출력과 표준 에러를 모두 하나의 파일로 저장하는 표기로 알맞은 것은?
문제 4
다음 중 SSH로 원격 접속했을 때 읽히는 개인 설정 파일로 알맞은 것은?
문제 5
다음 중 PATH 환경 변수에 기존 값을 유지하면서 /opt/bin을 추가하는 명령으로 알맞은 것은?
문제 6
다음 중 직전에 실행한 명령의 성공 여부를 확인할 수 있는 특수 변수와 성공을 뜻하는 값으로 알맞은 것은?