728x90
반응형

1. 셸 개요

 

✅ 셸(shell)

  • 명령어 해석기 또는 명령 행 인터페이스
    • 사용자와 커널 사이에서 명령어를 해석하여 처리
    • 셸 명령을 사용하면 GUI로는 하기 힘든 다양한 기능을 수행할 수 있음
  • 셸 명령을 프로그램으로 작성하여 처리할 수도 있음
    • 셸 스크립트는 텍스트 파일로, 프로그래밍을 통한 셸 명령의 조합
    • 반복적으로 수행되는 작업을 셸 스크립트로 작성할 수 있음
    • 셸이 쉘 스크립트 파일을 읽어 처리할 수 있음
  • 로그인을 하면 기본 셸이 주어짐
  • 종류
    • 많은 리눅스 배포판에서 bash를 기본 셸로 사용함 → 명령 프롬프트로 일반 사용자는 $, root 사용자는 #을 사용함
    • 셸의 종류에 따라 alias 설정, 초기화 파일, 스크립트 작성, 명령 행 완성 기능, 명령 행 편집 기능 등에 차이가 있음

 

 

 

✅ bash 셸

  • Bourne Again Shell로 Bourne 셸의 개선된 버전 (많은 셸 스크립트의 문법이 Bourne 셸에 기반을 둠)
  • C 셸과 Korn 셸의 유용한 기능을 가져옴
  • 실행 명령은 /bin/bash
    • /etc/passwd 파일에 아래와 같은 라인이 있음

사용자ID: x: 사용자ID: 그룹ID: 사용자 설명: 해당 계정의 홈 디렉터리: 기본셸

 

  • 기본 셸을 변경할 수 있으며 터미널 창은 대화형 셸임
chsh -s /bin/tcsh 기본 셸 변경
 exit (ctrl + d) 셸 종료
  • 로그인 셸과 비로그인 셸을 구별해야 함
    • logout 명령은 로그인 셸에서만 가능
    • 참고로 ctrl + alt + F2~6으로 가상 콘솔을 사용할 수 있음. 실제 콘솔이 하나만 있더라도 가상 콘솔을 여러 개 띄워서 사용 가능 (콘솔: 서버 컴퓨터에 직접 물려있는 터미널, ctrl + alt + F1)
    •  셸 프롬프트에서 셸 프로그램을 실행하면 '서브 셸'이 실행됨

 

 

 

 

 

2. 셸 명령

 

✅ 셸 명령의 형식

명령어 [options] [인수]
  • 명령어는 대게 프로그램으로 존재(그래서 실제로 해당 명령어의 실행 파일이 어딘가 존재)
  • 가장 간단한 형태의 실행은 명령어만 사용 (예: who, date, ls, pwd)
who 로그인한 모든 사용자의 정보 출력
date 현재 요일과 날짜 및 시간 출력
ls 디렉터리가 가지고 있는 파일이나 서브 디렉터리 목록 출력
pwd 현재 작업 디렉터리 경로 출력
  • 옵션인수는 여럿일 수 있으며 선택적 또는 필수적
    • 대괄호는 생략 가능, 이탤릭체는 적당한 내용으로 대체해야 함. 복수는 여러 개가 가능하다는 의미

 

 

 

옵션과 인수

  • 짧은 옵션 (-) : Unix 스타일
    • ls -l
    • ls -lat == ls -l-a-t
  • 긴옵션(--) : GNU 스타일, 이중 대시 뒤에는 약어가 아닌 단어가 붙음
    • ls --all
  • 인수는 명령의 수행 대상을 지정하는 것
    • cat -n /etc/passwd
    • grep "KilDong Hong" /etc/passwd → 수가 2개인 경우도 있음
  • 옵션도 인수를 가질 수 있음
    • chsh -s /bin/sh kdhong
    • chsh --shell=/bin/bash kdhong → 옵션에 인수가 필요할 경우에 옵션과 인수 사이에 '=' 기호 붙여야 하고 그 사이에 공백 없어야 함

 

 

 

✅ 명령어의 종류

alias - 자주 사용되는 명령의 단축 명령을 만드는 명령

- alias : 현재 설정 되어있는 alias 확인
- alias la='ls -A'
- alias rm='rm -i'

- 계속 유지하려면 셸의 환경 설정 파일에 기록해두어야 함
셸 예약어 예약된 단어로 do, while, case 등
함수 셸에서 수행되는 함수의 정의
내장 명령 - 셸 내부에 존재하는 명령으로 cd, echo, pwd 등 → 별도의 실행 파일이 존재하지 않고 셸 프로그램 안에 존재

- help 내장 명령 : 해당 내장 명령어 사용법 안내
일반 명령 - 실행 파일이 존재하는 명령(환경 변수 PATH에 설정된 경로 중에 실행파일이 존재하면 이름만으로 실행 가능)

-  PATH에 경로가 없는 프로그램을 실행할 때는 절대 경로를 사용해야 함

- 현재 디렉터리를 의미하는 '.'은 보통 PATH에 포함되어있지 않기 때문에 현재 디렉토리에 있는 프로그램을 실행시킬 때 이름만 주고 실행시키면 셸이 그 명령을 이행하지 못할 수 있음! ./실행프로그램명을 쓰거나 PATH에 현재 디렉토리를 추가해줘야 함


- echo $PATH로 저장된 경로를 확인할 수 있음

- 일반 명령 --help : 해당 일반 명령어 사용법 안내

 

 

 

✅ 기타 셸 명령 & 명령 히스토리

 type 명령 - 해당 명령어가 어떻게 해석되는지 알려주는 명령
- type cd, type -a ls
which 명령 - 실행 프로그램을 환경변수 PATH를 기초로 찾아 경로를 출력함
- which rm → /usr/bin/rm
whereis 명령 - 실행 프로그램 경로뿐만 아니라 소스 프로그램 경로와 매뉴얼 페이지 경로 출력
- whereis rm → /usr/bin/ rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz
man 명령 - 매뉴얼 페이지를 보여줌
- 명령의 사용법이나 설정 파일 등에 관한 온라인 도움말 제공
- man passwd 또는 man 5 passwd (섹션 5 내용을 출력하라는 뜻. 페이지가 8가지 섹션으로 나뉘어져 있음)
history 명령 - 이전에 수행했던 명령 행의 목록을 불러옴
- history (최대 1000개까지 출력) 또는 history 10

✔️ 히스토리 기능을 이용하여 명령을 실행하는 방법
(이전에 수행했던 명령을 이용하여 명령을 수행할 수 있음)


- !!: 직전명령을 불러옴
- !숫자: 히스토리 목록에서 입력한 숫자값에 해당하는 명령 불러옴
- !문자: 지정된 문자열로 시작하는 최근 명령을 불러옴
 - [↑] 또는 [↓] : 누를 때마다 직전 또는 직후 명령을 불러옴


✔️명령 행 완성 기능
- 일부만 입력하고 나머지를 자동 완성으로 하는 기능
- 처음 몇 자만 입력한 후, [tab]키를 누르면 실행! 명령어, 변수($), 파일, 디렉터리(~ 또는 -) 등을 구분하여 결정함
- 정보가 충분하지 않은 경우, [tab]키를 한번 더 누르면 가능한 모든 경우를 보여주고 원래의 명령행 유지 

 

 

 

 

 

3. 명령의 연결과 확장

 

🔸특수문자

: 셸에서 특별한 의미를 가지는 문자

백슬래시( \ ) 특수 문자의 기능을 제거하는 이스케이프(escape) 문자
또는 긴 명령 행을 분리할 때 사용 => [ \ ] + [ enter ] 키를 누르면 다음 명령 행에 명령을 이어쓸 수 있음
틸드( ~ ) ~ 또는 ~username은 사용자의 홈디렉터리를 의미
도트( . ) 현재 작업 디렉터리를 표시
또는 명령 행의 맨 앞에서 쉘 스크립트를 실행하는 source 명령
더블도트( .. ) 현재 디렉터리의 부모 디렉터리
파운드( # ) 주석 처리
달러( $ ) $변수는 변수 값을 추출
 앰퍼샌드( & ) 명령&는 명령을 백그라운드로 실행시킴
↔ &를 붙이지 않으면 포그라운드로 실행. 해당 명령이 끝나야만 명령 프롬프트가 등장
애스터리스크
( * ) 
파일 이름에서 사용할 때 0개 이상의 임의 문자열과 대응됨
 물음표( ? ) 파일 이름에서 사용할 때 1개 문자와 대응됨
 파이프( | ) - 앞 명령의 출력 결과를 다음 명령의 입력으로 연결시킴
- 명령1 | 명령2 => cat /etc/passwd | sort | more
 ( < ), ( > )
*입출력 리다이렉션

- 입력 리다이렉션: 명령 수행에 필요한 표준 입력(키보드 입력) 대신에 파일로부터 데이터를 얻는 방법
- 명령<파일
예) sort</etc/passwd

(sort만 입력한 다음 엔터키 치면 라인 단위로 사용자의 입력을 받아서 그 입력 값을 정렬함)

- 출력 리다이렉션: 명령 수행의 결과를 표준 출력으로 보내지 않고 파일에 기록함
- 명령>파일
예) grep typedef /usr/include/*>typedef.out
>>  - 표준 출력을 파일의 끝에 덧붙일 때 사용

- 명령 수행 중 표준 오류 출력을 파일에 덧붙임
- 명령 2>>파일
예) ls 2>>error.txt
느낌표( ! ) 명령 히스토리 기능을 이용할 때 사용

 

 

 

🔸인용 부호

  • 빈칸을 포함하는 문자열을 1개의 인수로 사용할 때 인용 부호가 필요함
echo I am a student → 인수 갯수: 4
echo "I am a student" → 인수 갯수: 1
  • 작은따옴표(' ')는 특수 문자의 의미를 제거함
  • 큰따옴표(" ")$, ` `, \, ! 를 해석하여 확장함
    • \ : escape 문자로서  echo "\ $(date)" 이 경우 \뒤의 $의미가 없어지기 때문에 명령어로 해석되지 않고 문자로 출력됨

 

 

🔸명령 치환

  • 명령을 수행할 때, 명령의 인수에 다른 명령의 결과를 사용
  • $(명령어) 또는 ` 명령어`
    • ls -l $(which passwd) : /usr/bin/passwd 파일의 정보 출력

 

 

 

🔸수식 확장

  • 수식 결과를 명령 수행 전에 전달
  • $[수식] 또는 $((수식))

 

 

 

🔸변수 확장

  • 변수 값을 추출하여 명령 수행 전에 전달
  • $변수

 

 

 

 

 

4. 셸 변수

 

✅ 셸 변수

  • 셸의 환경 설정을 하기 위한 값을 저장 → 모든 변수와 값을 출력하기 위해 set 명령을 사용
  • 현재 셸에서만 사용 가능하고 서브 셸로는 전달되지 않음(지역변수)

 

환경 변수

  • 현재 셸 뿐만 아니라 서브 셸로도 전달(전역변수)
  • 보통 변수 이름으로 대문자를 사용
  • 터미널 창을 열어 쉘을 시작하면 이미 많은 환경변수가 설정되어 있음
  • 모든 환경 변수와 값을 출력하기 위해 printenv 명령을 사용

 

변수= 변수 설정
※이콜 사인 사이에는 공백이 들어가면 안 됨!
export 변수 환경 변수 설정
printenv 환경변수 해당 환경 변수의 값을 확인
echo $변수 모든 종류(셸 변수, 환경 변수..)의 변수 값을 확인

 

 

 

 

🔸자주 사용되는 환경 변수

 

HISTSIZE 1개 셸에서 저장되는 명령 히스토리 목록의 최대 갯수(기본 값: 1000)
HOME 홈 디렉터리
MAIL 사용자의 메일박스에 해당하는 파일로 보통 /var/spool/mail/username
PATH 명령을 수행할 때 실행 파일을 찾기 위한 디렉터리 목록
PS1 쉘 프롬프트 모양을 표시하기 위한 문자열
SHELL 사용 중인 기본 셸
PWD 현재 작업 디렉터리
USER 현재 사용자 계정

 

 

 

🔸로그인/셸 환경 설정 파일

  • 로그인할 때 또는 셸을 시작할 때 자동으로 실행되는 명령을 저장한 파일
    • 시스템 환경 설정 파일과 사용자 환경 설정 파일이 있음
    • 셸의 종류에 따라 다른 이름의 파일을 사용함

 

bash 셸의 경우 아래와 같음

실행순서 파일 설명
1 /etc/profile - 모든 사용자에게 적용되고 로그인할 때 가장 먼저 수행됨
- PATH, MAIL, HISTSIZE 등 전역의 환경 변수가 설정됨
2 ~/.bash_profile - 로그인할 때 수행되며 개별 사용자에게 적용됨
- 보통 내부에서 ~/.bashrc를 실행
3 ~/.bashrc - 쉘을 시작할 때마다 수행되며 개별 사용자에게 적용됨
- 보통 내부에서 /etc/bashrc를 수행
4 /etc/bashrc - 모든 사용자에게 적용되며 쉘을 시작할 때마다 수행됨
- PS1, alias 설정, umask를 사용한 접근권한의 초기 값, 함수 등을 설정
5 ~/.bash_logout - 로그아웃을 수행할 때 실행되는 스크립트 파일
  • 로그인할 때 1,2번 반드시 실행되고 쉘을 시작할 때 3,4번이 반드시 실행됨
  • 3번이 먼저 실행되지만 4번이 먼저 끝남

 

 

728x90
반응형

'KNOU > UNIX시스템' 카테고리의 다른 글

[UNIX 시스템] 2. 리눅스 설치  (1) 2022.09.11
[UNIX 시스템] 1. 리눅스 소개  (0) 2022.09.06

+ Recent posts