9 분 소요

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 -lls 로 에일리어스 설정 $ alias ls='ls -l'

  • rm -irm으로 에일리어스 설정 $ alias rm='rm -i'

에일리어스 해제하기(unalias)

  • lsrm 에일리어스 해제
    $ 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)
  • 에일리어스와 히스토리
  • 프롬프트 설정

태그: ,

카테고리:

업데이트:

댓글남기기