770 likes | 981 Views
Shell Part 1. http://rainbow.sunmoon.ac.kr/~yypark http://ubilab.sunmoon.ac.kr. Shell 기초. 쉘. 출력. 유닉스 운영체제. 입력. What is Shell?. 유닉스 운영체제의 사용자 인터페이스 사용자가 입력한 명령을 운영체제가 이해할 수 있는 명령으로 바꾸고 운영체제가 처리한 결과를 사용자에게 돌려주는 일종의 프로그램. 쉘 역사. bash shell. bash(GNU Bourne-Again Shell)
E N D
Shell Part 1 http://rainbow.sunmoon.ac.kr/~yypark http://ubilab.sunmoon.ac.kr
쉘 출력 유닉스 운영체제 입력 What is Shell? • 유닉스 운영체제의 사용자 인터페이스 • 사용자가 입력한 명령을 운영체제가 이해할 수 있는 명령으로 바꾸고 운영체제가 처리한 결과를 사용자에게 돌려주는 일종의 프로그램 3
쉘 역사 4
bash shell • bash(GNU Bourne-Again Shell) • 리눅스에서 /bin/sh로 항상 설치되는 표준 쉘 • GNU 도구모음의 일원 • 소스코드가 공개되어 있고 거의 모든 유닉스 변형에 이식 가능 • GNU 웹사이트 http://www.gnu.org에서 무료로 다운로드받을 수 있음 5
사용자에 따른 쉘 설정하기 • 각 리눅스 사용자 계정에 따라, 사용할 쉘을 설정해 줄 수 있다 7
사용자 로그인 /etc/profile 을 읽어들임 .bash_profile 파일을 실행(source)시킴 초기화 파일 • 배시 쉘은 여러 가지 초기화 파일들을 ‘source’ 명령어를 사용하여 현재 쉘에 적용. 해당 파일에 설정된 모든 변수들이 현재 쉘의 일부가 됨(자식 쉘이 생성되지 않음) • /etc/profile • 사용자가 로그인할 때, 쉘 프롬프트가 나타나기 전에 시스템 전체에 적용되는 초기화 파일 • .bash_profile • 사용자의 홈 디렉토리에 위치 (ex: /root/.bash_profile) • 별명, 함수, 환경변수 및 시작 스크립트 등을 설정하거나 정의함 9
/etc/profile ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc /etc/profile 파일 • 사용자가 로그인할 때, 시스템 전체적으로 공통된 초기화를 위해 관리자가 설정하는 파일 • 배시 쉘이 시작할 때 실행되며, 시스템 상의 모든 본 쉘과 콘 쉘 사용자들에게 적용됨 • 주로 새로 도착한 메일의 확인이나, 오늘의 메시지(message of the day) 출력 등과 같은 작업을 수행 10
~/.bash_profile 파일 • /etc/profile 다음에 읽어들이는 파일 • ~/.bash_profile 파일을 수정한 후 적용하려면 다음과 같이 ‘source’명령어를 사용하여 적용하거나 로그아웃한 다음 다시 로그인 한다 • #source .bash_profile • 홈디렉토리에 ~/.bash_profile이 없으면 쉘은 ~/.bash_login을 찾고 이 파일도 없으면 ~/.profile을 찾는다(배시 쉘은 이들 세 파일들 중에서 하나만 처리함) 11
~/.bashrc 파일 • BASH_ENV(ENV) 변수에는 관례상 이름인 .bashrc 파일의 이름이 지정됨 • 새로운 배시 쉘이나 대화형 배시 쉘 또는 배시 스크립트가 시작할 때마다 이 파일이 실행됨 • 배시 쉘에만 적용되는 특별한 설정사항이 들어있음 13
/etc/bashrc 파일 • 시스템 전체에 적용되는 함수와 별명들은 /etc/bashrc 파일에서 설정할 수 있음 (주 프롬프트는 보통 이 파일에서 설정) 14
~/.bash_logout 파일 • 로그아웃할때 ~/.bash_logout 파일이 존재하면 이 파일을 실행 • 임시파일을 비우는 명령어, 히스토리 파일을 정리하는 명령어, 로그아웃 시간을 기록하는 명령어 등이 있음 15
명령행 • 공백(스페이스, 탭)으로 구분되는 하나 이상의 단어(혹은 token)로 시작하여 개행문자(\n)로 끝남 • 첫번째 단어를 명령어로 인식, 뒤이어 나오는 단어들은 인자로 취급 • 명령어 : ls나 pwd, 또는 cd나 test등의 내부 명령어, 쉘 스크립트 등과 같이 실행 가능한 프로그램. 메타문자와 같은 특수문자도 포함 17
명령어 처리 순서 • 명령어는 키워드, 내장명령어, 함수, 스크립트, 실행 가능한 프로그램 등이다 • 처리순서 • 1)키워드 (if, while, until 등) • 2)별명 (typeset –f 참고) • 3)내장 명령어 • 4)함수 • 5)스크립트와 실행 가능한 프로그램 18
내장 명령어와 help 명령어 • 내장명령어 • 쉘 내부 코드의 일부 • 쉘이 실행중이면 언제든지 사용가능 • 명령어 help는 자체 내장 명령어임 19
명령행 처리 순서의 변경 • 명령어 ‘command’ • 쉘이 명령행 처리 순서에 따라 별명과 함수를 우선적으로 찾아보는 것을 막아줌 • 명령어 ‘builtin’ • 단지 내장 명령어만 실행시킴. 함수나 검색경로 상의 프로그램들은 무시함 • 명령어 ‘enable’ • 내장 명령어들의 사용 여부를 설정 • 내장 명령어의 사용을 해체하려면 –n 옵션을 사용 20
종료 상태 • 명령어나 프로그램의 수행이 끝날 때 부모 프로세스에 종료 상태를 되돌림 • 0부터 255 사이의 정수로 표현 • 0이외의 상태는 명령어의 수행이 실패했음을 뜻함 • 명령어를 찾지 못할 경우 => 127의 상태 반환 • 치명적인 시그널로 인한 종료 => 128에 그 시그널의 값을 더하여 반환 • 변수 ‘?’ => 마지막에 수행된 종료상태가 저장됨 21
명령행에서 여러 명령어 사용 • 명령행 한 줄에 여러 개의 명령어를 사용할 수 있음 • 각 명령어들은 세미콜론(;)으로 구분 • 해당 명령행을 종료할 때는 개행문자를 입력함 22
# 첫번째 명령어가 성공적으로 실행되면(종료상태값: 0) && 다음의 명령어도 실행된다. #gcc 프로그램이 program.c를 성공적으로 컴파일하면 이때 생성된 program 실행파일을 실행하게 된다 명령어 그룹화 • 명령어들을 그룹으로 묶어서 실행한후, 결과를 파이프나 리다이렉션에 사용할 수 있다 23
#편집기인 gedit를 백그라운드로 실행한다 #실행중인 gedit 프로세스를 종료한다 백그라운드에서 실행 • 포그라운드(foreground) • 일반적으로 사용자의 명령어가 실행 • 명령어의 실행이 끝날때 까지 프롬프트가 나타나지 않음 • 항상 명령어의 종료를 기다려야 함 • 백그라운드(background) • 앰퍼센드(&)기호를 명령어의 마지막에 추가하면 쉘은 쉘 프롬프트를 즉시 나타내고 명령어를 백그라운드에서 동시에 실행시킬 수 있음 • 다른 명령어를 수행시키기 위해 이전 명령어의 종료를 기다릴 필요가 없음 • 변수 ‘!’는 마지막으로 백그라운드에서 수행되었던 작업의 PID번호를 저장하고 있음 24
작업 제어 • 배시 쉘이 제공하는 작업 제어(job control) 기능은 사용자가 작업의 실행 환경을 포그라운드 혹은 백그라운드 중에서 임의로 지정할 수 있게 해줌 • 실행 중인 프로그램을 프로세스(process) 혹은 작업(job)이라고 부르며, 각 프로세스는 프로세스 ID 번호(PID)를 갖게 됨 25
# vi 편집기를 실행한 상태에서 ^Z 키를 누르면 편집기의 실행이 백그라운드 상태에서 중지됨. Stopped라는 메시지가 출력되고 쉘 프롬프트가 즉시 나타남 # sleep 명령어를 백그라운드에서 실행. [2]는 이 명령어가 백그라운드에서 두번째로 실행되는 작업임을 나타냄. PID는 7328이다. # jobs 명령어는 현재 백그라운드에서 실행중인 작업들을 보여줌 # jobs –l 명령어는 백그라운드 실행중인 작업의 PID번호를 함께 보여줌 # %% 인자는 가장 최근에 실행한 명령어를 표시하도록 한다 # fg 명령어를 사용하여 해당번호의 작업을 포그라운드로 가져옴. (Vi 편집기가 실행되면 다시 ^Z키를 누른다) # -x 옵션으로 작업의 PID번호만 출력함. %1은 1번에서 중단된 vi 세션 # kill 명령어는 TERM 시그널을 해당 프로세스에 보내 종료시킴 %1이므로 vi 프로그램이 종료됨 작업 제어 예제 26
히스토리(history) • 쉘에서 제공하는 히스토리 기능을 사용하여 명령행에서 입력한 명령어들을 지정한 개수만큼 보관함 • 로그인 후 사용자가 입력한 명령어들은 쉘 메모리의 히스토리 목록에 저장 • 로그아웃 할때 히스토리 파일에 덧붙이게 됨 • 한번 사용했던 명령어들은 히스토리 목록에서 불러와 재실행시킬 수 있음 27
내장명령어 history • 히스토리 파일의 기본 이름 => .bash_history • 내장명령어 history는 히스토리 목록의 항목을 일련번호(event number)와 함께 출력 28
fc 명령어(1) • 명령어 fc –l 을 사용하여 히스토리 목록을 출력하거나 편집할 수 있음 • ‘fc –l’ 은 기본값으로 히스토리 목록 중 마지막 16항목을 출력 29
fc 명령어(2) • ‘fc –l -3’ • 목록의 마지막 세 항목을 출력함 • ‘fc –ln’ • 옵션 n은 목록에서 일련번호를 제외하고 출력함 • ‘fc –lr’ • 마지막 목록 16항목을 거꾸로 출력함 • ‘fc –l 15 20’ • 15번에서 20번까지의 명령어들을 출력함 30
# date 명령어를 실행. 히스토리 목록이 갱신됨 # !!는 히스토리 목록의 마지막 등록된 명령어를 재실행 # 히스토리 목록의 150번 명령어를 재실행 # 히스토리 목록에서 d로 시작하는 명령어중 마지막으로 실행된 명령어를 재실행 # date 명령어를 dare로 잘못 입력 # ^키를 이용해 히스토리 목록의 마지막 명령어의 잘못된 입력을 정정함. 첫번째 r이 t로 교체되어 date가 됨 history 예제(1) 31
history 예제(3) # ‘!$’는 마지막 명령어의 마지막 인자를 의미 # ‘!^’는 히스토리 목록에서 마지막 명령어가 가지는 첫번째 인자 # ‘*’는 명령어 다음의 모든 인자를 나타냄 # 히스토리 상의 마지막 명령어를 출력만 하고 실행하지는 않음 33
별명(alias) • 별명(alias)은 어떤 명령어를 사용자가 알맞게 줄여서 재정의할 수 있도록 배시 쉘에서 지원하는 기능 • 새로운 쉘이 시작할 때마다 실행되기 위해 주로 .bashrc 파일에서 정의 34
별명(alias) 정의 • ‘alias’ 명령어 사용 • 첫번째 인자는 지정할 별명 • 명령행의 전체 부분이 해당 별명에 지정됨 • 여러 명령어를 사용할 경우, 세미콜론(;)으로 분리시킴 • 공백이나 메타문자를 포함할 때는 작은따옴표로 묶어줌 35
별명(alias) 삭제 • ‘unalias’ 명령어 사용 • 일시적으로 별명을 비활성화할 때는 역슬래시를 별명 앞에 붙임 36
메타문자(와일드카드) • 문자 자체가 아닌 어떤 다른 의미를 나타내기 위해 사용하는 특수 문자 37
메타문자 예제(1) • 별표 문자 (*, asterisk) 38
# 두 개의 문자로 이루어진 파일이름들을 출력 # 현재 디렉토리에는 두개의 문자로 이루어진 파일이름이 없으므로 쉘은 물음표를 메타문자가 아닌 일반 문자로 처리하여 echo 명령어의 인자로 사용함 메타문자 예제(2) • 물음표 (?) 39
메타문자 예제(3) • 대괄호 ([ ], square bracket) 40
메타문자 예제(4) • 중괄호 ({ }, curly brace) 41
쉘 변수 • 지역변수 (local variable) • 자신을 생성한 쉘에서만 사용가능 • 환경변수 (environment variable) • 자신을 생성한 쉘 뿐만 아니라, 이로부터 파생되어 나온 자식 프로세스에서도 사용가능 • 변수 명칭 표준 • 알파벳, 0부터 9까지 숫자, 밑줄문자(_) 사용가능 • 첫글자는 알파벳과 밑줄문자(_)만 가능 • 대소문자 구별함 • 변수에 값을 할당할 때 등호(=) 양쪽에 공백이 있어서는 안됨 • 널 값 지정시 등호 바로 다음에 개행문자 입력 형식: variable=value 43
#변수생성 내장명령어 “declare” #공백이 있으면 문자열을 분리하여 단어들로 인식하므로 따옴표 사용 # 널값 지정 #마침표는 변수이름에 사용불가 지역변수 설정 예제 44
환경변수 설정 • 자신이 생성된 쉘 뿐만 아니라, 자식 쉘이나 프로세스에서도 사용 • 전역변수라 함 • 표준에 따라, 환경변수 이름은 대문자를 사용(예: HOME, LOGNAME, PATH, SHELL 등) • 일반적으로 홈 디렉토리의 .bash_profile 파일에서 정의함 • 변수에 값을 대입하거나, 설정이 끝난 후에 ‘export’ 명령어를 사용 형식: export variable=value variable=value; export variable declare –x variable=value 45
# pid number for parent shell # start a subshell # pid number for new shell # Exit the subshell and go back to parent shell # pid number for parent shell 환경변수 설정 예제 46
변수값 출력: echo 명령어 • 내장명령어 echo는 자신의 인자들을 표준 출력으로 보낸다. –e 옵션을 사용하면 출력의 형식을 제어할 수 있는 다양한 확장 문자열(escape sequence)을 사용할 수 있다. 47
printf 명령어 • 출력 서식을 지정 • 배시 2.0 버전이후 내장명령어가 됨 • 서식 문자열을 C언어의 printf함수와 같은 방식으로 출력시켜줌 48
위치 인자 • 위치 인자(positional parameter)라 불리는 특별한 내장 변수들은 명령행에서 쉘 스크립트로 인자를 넘겨주기 위해 사용 • 쉘 스크립트의 이름은 변수 $0에 저장됨 • ‘set’ 명령어를 사용하여 위치 인자를 설정할 수 있음 49
# prints the first positional parameter # eval 명령어는 명령행을 두번 분석하여 실행시킴 # set 명령어에 – 옵션을 사용하면 모든 위치 인자들을 삭제하거나 설정을 해제함 위치 인자 예제 50