쉘이란 명령어를 해석하여 커널에 전달해 주는 인터페이스를 제공하는 프로그램을 지칭하며
그래픽 쉘 ( GUI ) 과 명령줄 쉘 ( CLI ) 로 나뉜다.
이중 쉘 을 사용하는 경우 보통 CLI 를 가리키는 경우가 많다.
쉘 스크립트란 이런 쉘 인터프리터를 통해 실행할 수 있는 스크립트를 말한다.
보통 많이 사용하는 쉘에는 아래와 같은 것들이 있다.
리눅스 계열 sh
리눅스 계열 bash
리눅스 계열 csh
윈도우 cmd
윈도우 powershell
쉘 스크립트 작성과 실행
쉘 스크립트 파일의 확장명은 되도록 *.sh 로 주는 것이 좋다.
sh <스크립트 파일> 형식으로 호출하거나
chmod +x <스크립트 파일> 명령으로 실행 가능 속성으로 변경한 후에
./<스크립트파일> 명령으로 현재 디렉토리에 있는 스크립트 파일을 실행 할 수 있다.
쉘 스크립트 선언
어떤 쉘로 동작할지 지정하기 위해서
#! 를 사용한다.
#!/bin/bash
Bash 쉘로 동작
#!/bin/tcsh
TC 쉘로 동작
#!/bin/sh
기본 쉘로 동작
#!/bin/csh
c 쉘로 동작
쉘 스크립트 실행
<SHELL> -f 파일명.sh
파일 디스크립터
유닉스는 실제 파일 뿐 아니라 장치 역시도 파일로 분류한다.
그리고 프로세스가 이 파일 (파일, 디렉토리, 소켓, 디바이스 ) 들을 접근할 때에
파일 디스크립터(File Descriptor)라는 '0이 아닌 정수' 핸들을 부여한다.
예를 들어 프로세스가 실행 중에 파일을 Open 하면 커널은
해당 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 파일의 FD 로 할당하고
프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근 할 때,
FD 값을 이용해 파일을 지칭 할 수 있다.
추가로 프로그램이 프로세스로 메모리에서 실행을 시작 할 때,
기본적으로 할당되는 파일 디스크립터들이 있다.
바로 표준 입력(Standard Input), 표준 출력(Standard Output), 표준 에러(Standard Error) 버퍼 파일 스트림이다.
이 들에게 각각 0, 1, 2 라는 정수가 할당되며,
POSIX 표준에서는 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO 로 참조된다.
리다이렉션
리다이렉션은 추가로 프로그램이 프로세스로 메모리에서 실행을 시작 할 때,
기본적으로 할당되는 파일 디스크립터 FD 1,2,3 을 파일 스트림이 아닌
사용자 할당 파일로 사용하는 것이다.
이때 사용하는 리다이렉션 기호는 아래와 같다
표준 입력 <
표준 출력 >
표준 에러 2>
예를 들어 ls -al > test.txt 명령은 FD 2번을 test.txt 파일로 연결해서
ls -al 결과가 test.txt 파일에 저장되는 결과를 가져온다.
터미널
유닉스 환경에서 터미널이란 사용자가 조작하는 쉘의 입출력 인터페이스를 말한다.
명령어 tty 로 현재 가상 터미널의 장치명을 얻을수 있다.
$ tty
/dev/pts/1
|
리다이렉션을 사용해서 입출력을 버리거나 특정 파일에 쓰거나
다른 가상 터미널에 출력을 보낼수도 있다.
표준 입력 </dev/pts/2 (가상터미널2에 보냄)
표준 출력 >/dev/pts/3 (가상터미널3에 보냄)
표준 에러 2>/dev/null (출력버림)
파이프
파이프는 프로그램의 출력 스트림 내용을
다른 프로그램의 입력 스트림으로 보내는 기능을 말하고 간단히 '|' 를 써주면 된다.
ls | more 같이 입력했다고 하면 이 명령은 사실 ls pipe more 와 같다.
이때의 동작을 살펴보자.
1. ls 실행되면서 stdin, stdout, stderr 스트림이 생성되고 FD 1,2,3 번으로 저장
2. pipe 가 ls 의 FD 2번인 stdout 을 자체 버퍼에 저장
3. more 실행되며 생성되는 stdin, stdout, stderr 스트림 생성
4. pipe 가 more 의 FD 1 (stdin) 에 버퍼에 저장된 내용을 전달
'LINUX > Shell Script' 카테고리의 다른 글
05. case 조건문 (0) | 2020.01.31 |
---|---|
04. if 조건문 (0) | 2020.01.31 |
03. 파라미터 (0) | 2020.01.30 |
02. 숫자계산 (0) | 2020.01.30 |
01. 변수 (0) | 2020.01.30 |