[Linux] 4. 셸 사용하기
1. 셸의 기능과 종류
셸(shell)의 기능
- 명령어 해석 기능, 프로그래밍 기능, 사용자 환경 설정 기능
명령어 해석 기능
해석기(interpreter)
및번역기(translator)
- 사용자와 커널 사이에서 명령을 해석하여 전달하는 기능을 의미로그인 셸
- 사용자가 로그인하면 셸이 자동으로 실행되어 사용자가 명령을 입력하기를 기다림로그인 셸
은/etc/passwd
파일에 사용자별로 지정프롬포트(prompt)
- 셸이 사용자의 명령을 기다리고 있음을 나타내는 표시
프로그래밍 기능
- 셸은 자체 내에 프로그래밍 기능이 있어 반복적으로 수행하는 작업을 하나의 프로그램으로 작성
- 이러한 셸 프로그램을
셸 스크립트
라고 함
사용자 환경 설정 기능
- 사용자 환경을 설정할 수 있도록 초기화 파일 기능을 제공
- 초기화 파일에는
명령어 경로
를 설정하거나, 파일과 디렉터리를 생성할 때의기본 권한
을 설정하거나, 다양한환경변수
등을 설정
셸의 종류
본 셸
,콘 셸
,C 셸
,배시 셸(Bash shell)
,대시 셸
본 셸(Bounce shell)
- 초기에
본 셸
은 단순하고 처리 속도가 빨라서 많이 사용되었고, 지금도 시스템 관리 작업을 수행하는 많은셸 스크립트
는 본 셸을 기반 - 히스토리, 에일리어스, 작업제이 등 사용자의 편의를 위한 기능을 제공하지 않아서 다른 셸들이 등장
sh
- 본 셸을 수행하기 위한 명령어
C 셸(C shell)
- 본 셸에는 없던 에일리어스나 히스토리 같은 사용자 편의 기능을 포함
- 셸 스크립트(셸 프로그래밍) 작성을 위한 구문 형식이 C 언어와 같아 C 셸 이름
csh
- C 셸을 수행하기 위한 명령어
콘 셸(Korn shell)
- C 셸과 달리 본 셸과의 호환성을 유지하며 히스토리, 에일리어스 기능 등과 C 셸의 특징도 모두 제공, 처리 속도 빠름
ksh
- 콘 셸의 명령어
배시 셸(bash shell)
- 본 셸과 호환성을 유지하면서 C 셸, 콘 셸의 편리한 기능도 포함
- 배시 셸의 모든 버전은 GPL(라이선스)에 의거하여 자유롭게 사용 가능
리눅스
의 기본 셸로 제공되어 있어리눅스 셸
로도 많이 알려짐bash
- 배시 셸의 명령어
대시 셸(dash shell)
- 본 셸 기반
- 우분투 6.10부터는 본 셸(sh)을 실행시키면
대시 셸
이 실행 ( 본 셸 지원 X) - 우분투에서 본 셸 실행파일인
/bin/sh
를 보면dash
로 심벌릭 링크가 되어 있음 user1@myubuntu:~$ ls -l /bin/sh
# /bin/sh -> dash
2. 셸 기본 사용법
기본 셸 확인
- 프롬프트 모양에서 현재 사용하고 있는 기본 셸 확인 가능
- 본 셸, 배시 셸, 콘 셸의 기본 프롬프트:
$
- C 셸의 기본 프롬프트:
%
- 본 셸, 배시 셸, 콘 셸의 기본 프롬프트:
- 사용자 정보 확인,
/etc/passwd
파일을 확인하여 기본 셸 확인 가능- 사용자 정보의 가장 마지막에 나온
/bin/bash
가 기본 셸 user1@myubuntu:~$ grep user1 /etc/passwd
- 사용자 정보의 가장 마지막에 나온
기본 셸(로그인 셸) 바꾸기
(chsh [옵션][사용자명])
기능: 사용자 로그인 셸을 바꾼다
형식:
chsh [옵션][사용자명]
옵션:
-s shell
: 지정한 셸(절대 경로)로 로그인 셸을 바꾼다
-l
:/etc/shells
파일에 지정된 셸을 출력한다ex)
chsh
chsh -l
chsh -s /bin/sh user1
/etc/shells
파일은 지원되는 모든 로그인 셸 이름 정보를 유지$ cat /etc/shells
기본 셸 바꾸기 (chsh [옵션][사용자명]
)
- 바꾸려는 셸은
절대 경로
로 지정 -
user1의 현재 셸(
bash
)을 본 셸(sh
)로 바꾸기$ chsh -s /bin/sh user1
- 기본 셸이 바뀌었는지 확인
$ grep user1 /etc/passwd
- user1 로그아웃 후, 다시 로그인 하면 shell 이 본 셸로 바뀌어 있음
- 다시 기본 셸(
sh
)을 배쉬 셸을 (bash
)로 변경 $ chsh -s /bin/bash user1
로그인 셸과 서브 셸
- 프롬프트에서 다른 셸을 임의로 실행할 수 있으며, 이를
서브 셸
이라고 한다 - 서브 셸은 또 다른 서브 셸 생성 가능
- 서브 셸 시작 (셸 명령어:
sh
,csh
,ksh
,bash
), 서브 셸 종료 (^d,exit
) - 서브 셸이 종료되면 서브 셸을 실행했던 이전 셸 환경으로 복귀
셸 내장 명령
- 셸은 자체적으로 내장 명령어를 가짐
- 셸 내장 명령은 별도의 실행 파일이 없으며 셸 안에 포함되어 있음 (예:
cd
) - 일반적인 리눅스 명령어(실행 파일)는
/bin
또는/usr/bin
디렉터리에 있음
배시 셸의 출력 명령 (echo)
- 화면에 한 줄의 문자열을 출력함 (환경변수 출력도 가능)
echo [-n][문자열]
user1@myubuntu:~$ echo "linux ubuntu"
user1@myubuntu:~$ echo $SHELL
기능: 화면에 한 줄의 문자열을 출력한다
형식:
echo [-n][문자열]
옵션:
-n: 마지막에 줄 바꿈을 하지 않는다
ex)
echoecho textecho -n text
$ echo linux
linux
$ echo "linux ubuntu"
linux ubuntu
특수문자 사용하기
- 사용자가 더욱 편리하게 명령을 입력하고 실행하도록 다양한 특수문자 제공
- 특수문자:
*, ?, |, ;, [], ~, '', "",
- 명령을 입력하면 셸은 먼저 특수문자가 있는지 확인하고 이를 적절한 형태로 변경한 후 명령을 실행함
특수문자 (*
)
- 임의의 문자열을 나타내는 특수문자로 0개 이상의 모든 문자로 대체 가능
특수문자
사용 예 | 기능 |
---|---|
ls * |
현재 디렉터리의 모든 파일과 서브 디렉터리를 나열한다. 서브 디렉터리의 내용도 출력 |
cp * /tmp |
현재 디렉터리의 모든 파일을 /tmp 디렉터리 아래로 복사 |
ls -F t* |
t, tmp, temp와 같이 파일명이 t로 시작하는 모든 파일의 이름과 파일 종류를 출력(t 주의) |
cp *.txt ../ch3 |
확장자가 txt인 모든 파일을 상위 디렉터리 아래의 ch3 디렉터리로 복사 |
ls -l h*d |
파일명이 h로 시작하고 d로 끝나는 모든 파일의 상세 정보를 출력 |
셸에서 지원하는 특수문자 사용하기
- 셸은 사용자가 더욱 편리하게 명령을 입력하고 실행하도록 다양한 특수문자를 제공함
- 특수문자: ` * ? []`
- 특수문자:
| ;
- 특수문자:
~ -
- 특수문자:
'' ""
- 특수문자:
> >> <
- 명령어를 입력하면 셀은 먼저 특수문자가 있는지 확인하고 이를 적절한 형태로 변경한 후 명령을 실행
특수문자 (?, []
)
- 하나의 문자를 대체하는 데 사용
?
는 길이가 1인 임의의 한 문자를,[]
는 괄호 안에 포함된 문자 중 하나를 의미
특수문자 ?
와 []
사용 예 | 기능 |
---|---|
ls t?.txt |
t 다음에 임의의 한 문자가 오고 파일의 확장자가 txt인 모든 파일의 이름을 출력한다. t1.txt, t2.txt, ta.txt 등이 해당된다. 단, t.txt는 제외 |
ls -l tmp[135].txt |
tmp 다음에 1,3,5 중 하나가 오고 파일의 확장자가 txt인 모든 파일의 이름을 출력한다. tmp1.txt, tmp3.txt, tmp5.txt 등이 해당된다. 단, tmp.txt는 제외 |
ls -l tmp[1-3].txt |
[1-3]은 1부터 3까지의 범위를 의미한다. 따라서 ls -l tmp[123].txt와 결과가 같다. 즉 tmp1.txt, tmp2.txt, tmp3.txt 파일이 있으면 해당 파일의 상세 정보를 출력 |
ls [0-9]* |
파일명이 숫자로 시작하는 모든 파일의 목록을 출력 |
ls [A-Za-z]*[0-9] |
파일명이 영문자로 시작하고 숫자로 끝나는 모든 파일의 목록을 출력 |
특수문자 (~,-
)
~ (물결표)
와- (붙임표)
는 디렉터리를 나타내는 특수문자~
만 사용하면 현재 작업 중인 사용자의 홈 디렉터리를 표시 (cd ~
)- 사용자 로그인 ID와 함께 사용하면(
~ 로그인 ID
) 해당 사용자의 홈 디렉터리 표시 (cd ~user1) -
는 cd 명령으로 디렉터리를 이전하기 직전의 작업 디렉터리 표시 (cd -
)
특수문자 ~
와 -
사용 예 | 기능 |
---|---|
cp *.txt ~/ch3 |
현재 디렉터리의 모든 파일과 서브 디렉터리를 나열한다. 서브 디렉터리의 내용도 출력 |
cp ~user2/lx.txt . |
user2라는 사용자의 홈 디렉터리 아래에서 lx.txt 파일을 찾아 현재 디렉터리로 복사 |
cd - |
이전 작업 디렉터리로 이동 |
특수문자(;, |
)
;
(쌍반점)과|
(파이프)는 명령과 명령을 연결;
은 연결된 명령을 왼쪽부터 차례로 실행|
은 왼쪽 명령의 실행 결과를 오른쪽 명령의 입력으로 전달
특수문자 ;
와 |
사용 예 | 기능 |
---|---|
date; ls; pwd |
왼쪽부터 차례대로 명령을 실행한다. 즉 날짜를 출력한 후 현재 디렉터리의 파일 목록을 출력하고, 마지막으로 현재 작업 디렉터리의 절대 경로를 보여준다 |
ls -al / \ more |
루트 디렉터리에 있는 모든 파일의 상세 정보를 한 화면씩 출력한다. ls -al / 명령의 결과가 more 명령의 입력으로 전달되어 페이지 단위로 출력되는 것이다 |
특수문자('', ""
)
''
(작은따옴표)과""
(큰따옴표)는 문자를 감싸서 문자열로 만들어주고, 문자열 안에 사용된 특수문자의 기능을 없앰''
는 모든 특수문자를,""
는$,
, ₩
을 제외한 모든 특수문자를 일반 문자로 간주하여 처리
특수문자 ''
와 ""
사용 예 | 기능 |
---|---|
echo '$SHELL' |
$SHELL 문자열이 화면에 출력된다 |
echo "$SHELL" |
셸 환경 변수인 SHELL에 저장된 값인 현재 셸의 종류가 화면에 출력된다 |
특수문자(>, >>, <
)
- 입출력의 방향을 바꾸는 특수문자
특수문자 >, <, >>
사용 예 | 기능 |
---|---|
ls -l > res |
ls -l 명령의 실행 결과를 화면이 아닌 res 파일에 저장 |
3. 입출력 방향 바꾸기
표준 입출력 장치 (키보드, 모니터)
- 표준 입력 장치: 셸이 작업을 수행하는데 필요한 정보를 받는 장치 -> 키보드
- 표준 출력 장치: 실행 결과를 내보내는 장치 -> 모니터
- 표준 오류 장치: 오류 메시지를 내보내는 장치 -> 모니터
- 표준 입출력 장치를 파일로 바꾸는 것을
리다이렉션(redirection)
이라고 함
파일 디스크립터
- 파일 관리에서 명령의 표준 입력, 출력, 오류를 편리하게 사용하기 위하여 붙이는 일련번호 (0, 1, 2)
- 입출력 장치를 변경할 때 이 파일 디스크립터를 사용
표준 입출력 장치의 파일 디스크립터
파일 디스크립터 | 파일 디스크립터 대신 사용하는 이름 | 정의 |
---|---|---|
0 | stdin | 명령의 표준 입력 |
1 | stdout | 명령의 표준 출력 |
2 | stderr | 명령의 표준 오류 |
모니터에서 파일로 표준출력 리다이렉션
- 파일 디스크립터 번호 1 이용 (
1은 생략가능
) - 명령어의 수행 결과를 모니터에서 파일로 출력을 변경함 (
>,>>
) >
: 기존 파일이 존재하면 기존 내용을 삭제하고 새로 결과를 저장함(덮어쓰기)>>
: 기존 파일의 내용 뒤에 새로운 출력 결과를 추가함명령 1> 파일이름
명령 > 파일이름
명령 >> 파일이름
표준출력 리다이렉션(1)
$ ls -al > out1
$ cat out1
$ date > out1
$ cat out1
$ ls -al > out2
$ cat out2
$ date >> out
$ cat out2
표준출력 리다이렉션(2)
- 파일 디스크립터 번호 2 이용 (
2는 생략 불가능
) - 명렁어 수행의 오류를 모니터에서 파일로 출력을 변경함 (`2>)
- 명령
2>
파일 이름$ ls /abc > out3 $ cat out3 $ ls /abc 2> out3 $ cat out3
표준출력과 표준오류를 각각 다른 파일로 리다이렉션 하는 예제
$ ls . /abc > out6 2> out7
표준출력과 표준오류를 한 파일로 리다이렉션 하는 예제
$ ls . /abc >> out8 2> out8
$ ls . /abc 2> out8 >> out8
$ ls . /abc > out8 2>&1
4. 배시 셸 환경 설정
셸 변수와 환경 변수
- 사용자마다 원하는 셸 환경을 설정하기 위하여 셸 변수와 환경 변수 설정
셸 변수
: 현재 셸에만 적용되고 서브 셸에는 적용되지 않음 (지역 변수)-
환경 변수
: 현재 셸 뿐만 아니라 서브 셸에도 적용됨 (전역 변수 - 현재 설정되어 있는 셸 변수와 환경 변수 모두 출력 (
set
) - set은 변수 뿐만 아니라, 함수로 정의된 것도 출력함
$ set
-
$ set | grep -n HIST
- 현재 설정되어 있는 환경 변수만 출력 (
env
) $ env
$ env | grep PATH
주요 셸 환경변수
|환경 변수|의미|환경 변수|의미|
|:—|:—|:—|:—|
|HISTSIZE
|히스토리 저장 크기|PATH
|명령을 탐색할 경우
|HOME
|사용자 홈 디렉터리의 절대 경로|PWD
|작업 디렉터리의 절대 경로
|LANG
|사용하는 언어|SHELL
|로그인 셸
|LOGNAME
|사용자 계정 이름||
특정 변수 출력하기 (echo)
- 변수의 값을 출력할 때는 변수 이름 앞에 특수문자 $를 붙임
$ echo $SHELL
$ echo $HOME
$ echo $SHELL /bin/bash
셸 변수 설정하기(변수 이름과 문자열 사이에 공백이 있으면 안됨)
변수명=문자열
$ SOME1=test1 $ echo $SOME1
환경 변수 설정하기 (export
)
- 먼저 셸 변수를 정의하고, export 명령을 사용하여 이를 환경 변수로 설정
$ export SOME1 $ env | grep SOME
- 셀 변수를 설정하면서 export 명령을 사용하여 한 번에 환경 변수로 전환
$ export $SOME2=test2 $ env | grep SOME
환경 변수를 다시 셸 변수로 바꾸기 (export -n
)
$ export -n SOME1 # SOME1은 환경변수에서 제거됨 -> 다시 셸 변수
$ env | grep SOME
변수 해제하기 (unset
)
unset 변수이름
# 셸, 환경변수 모두 날라감$ unset SOME1 $ unset SOME2
5. 에일리어스와 히스토리
에일리어스 (alias)
- 에일리어스는 우리말로 ‘별명’을 의미
- 기존의 명령어를 대신하여 다른 이름(별명)을 붙일 수 있도록 하는 기능
- alias를 사용하여 긴 명령 대신 짧은 명령을 만들어 사용 가능
- alias를 사용하여 여러 명령을 연결하여 하나의 명령으로 만들 수 있음
- alias를 사용하여 자주 사용하는 옵션을 포함하여 새로운 이름을 붙여서 사용 가능
- (현재 설정된 alias 출력)
alias
- (기존 명령어 대체를 위한 alias 사용)
alias 이름='명령'
- (여러 개의 기존 명령어 대체를 위한 alias 사용)
alias 이름='명령1;명령2;명령3.....'
기존 에일리어스 확인 (alias)
- 아무 지정 없이 alias 명령을 실행하면 현재 설정되어 있는 alias가 출력
$ alias
alias alert ~~~
alias grep= ~~
alias l= ~~~
$ ||
에일리어스 설정하기 (alias)
-
ls -l
을ls
로 에일리어스 설정$ alias ls='ls -l'
-
rm -i
를rm
으로 에일리어스 설정$ alias rm='rm -i'
에일리어스 해제하기(unalias)
ls
와rm
에일리어스 해제$ unalias ls $ unalias rm
히스토리 (history)
- 사용자가 이전에 입력한 명령을 다시 불러 사용 가능
- 이전에 입력한 명령어 보기
- 셸 변수 HISTSIZE에 저장된 숫자만큼 이전에 입력한 명령을 저장
$ history
history에서 검색된 명령어 재 실행하기 (!)
1) 직전 명령 재실행 (!!
)
$ ls
$ !! # 화살표로도 가능하지만, 유닉스(본 셸)은 화살표가 안멱혀서 !! 사용
2) history 번호로 명령 재실행 (!94
)
$ !94
3) history 에서 해당되는 문자열로 시작하는 마지막 명령 재실행 (!ls
)
$ !ls
history: 명령어 편집하여 재실행하기
- 화살표 키를 사용하여 오류가 난 명령을 다시 프롬포트로 불러내서 수정하여 재실행 가능
history 저장
- history는 로그 아웃할 때 홈 디렉터리 아래의 숨김 파일인 .bash_history에 저장
6. 프롬프트 설정
bash 셸은 셸변수 PS1에 현재 사용자가 사용하는 프롬프트가 설정
- 현재 프롬포트 설정 내용 확인
$ echo $PS1
프롬프트 변경 예제
- 우선, 현재 프롬프트 설정 내용을 다른 셸변수로 저장해 둠 (나중에 프롬포트 복귀를 위함)
$ MYPROMPT=$PS1
- 프롬프트 설정을 위한 PS1 변수에 새로운 프롬포트를 설정해 봄
예1) $ PS1 = '[$PWD]' 예2) $ PS1 = '[\u@\t $PWD]' # u는 user(사용자), time은 시간
- PS1 변수에 원래 프롬프트 설정정보를 가진 변수를 할당
$ PS1=$MYPROMPT
요약
- 셸의 기능 (
명령어 해석, 프로그래밍, 사용자 환경 설정
) - 셸의 종류 (
본 셸, 콘 셸, C 셸, 배시 셸, 대시 셸
) - 셸 기본 사용법 (
로그인 셸과 서브 셸, 출력명령 사용, 특수문자 사용
) - 입출력 방향 바꾸기 (
리다이렉션, >, 2>, >>, <
) - 배시 셸 환경 설정 (
set, env, export, unset
) - 에일리어스와 히스토리
- 프롬프트 설정
댓글남기기