쉘 & 쉘스크립트
- 개발자라면?/Linux
- 2022. 9. 1.
Shell
shell 사용
Section 번호 | 8영역 설명 |
1 | 실행 가능한 프로그램 또는 쉘 명렁어 |
2 | 시스템 콜 (System Calls) |
3 | 라이브러리 콜 (Libaries Calls) |
4 | 특수 파일 (Specail files) |
5 | 파일 형식과 규칙 (File format & conventions) |
6 | 게임 (Games) |
7 | 개요, 규칙 및 기타 |
8 | 슈퍼 유저 및 시스템 관리 명령 |
9 | 커널 루팅 (Kernel routines) |
shell 종류
shell 의 종류 | 특징 | 프롬프트 |
bash Bourne Again shell |
최초로 개발된 shell 인 Boure shell 의 변종 리눅스에서 가장 많이 사용되는 IEEE POSIX 호환이면 Boure shell과 호환되는 shell 로 GNU 프로젝트에 의해 만들어지고 배포되고 있음 |
$ |
sh Bourne shell |
c shell 이나 Korn shell 과 기능적인 면들 비교해보면 미흡한 점이 있음. 그 중 가장 큰 단점은 상호 대화형(Interactive) 방식을 취하고 있지 않다는 점 실습 스크린샷의 dash 에 링크된 sh 와는 별개의 것!! (헷갈리지 말자!!) |
$ |
csh C-Program Style shell |
버클리 캘리포니아 대학에서 개발된 프로그래머들에게 적합한 shell. 대화형 사용법에서는 Bourne shell 과 대부분 호환되지만 전혀 다른 프로그래밍 인터페이스를 가지고 있음 |
% |
ksh Korn shell |
일반적으로 유닉스에서 가장 많이 사용되고 있는 shell, Bourne shell 에 처음으로 현대적인 shell 기능(C shell 로 부터 차용한 것)을 도입한 shell | $ |
zsh | Korn shell 과 매우 유사한 shell 이지만 Korn shell 보다 더 많고 유용한 기능들을 추가해 개선시킨 것 | % |
Super user | # | |
Shell 이 다르다는 것은? >>> 명령어의 일부 문법 달라진다 >>> Ex: sh 는 old version 이라 "./" 사용 불가 (dash 아님!!) |
설치된 shell 확인하기
방법1
cat /etc/shells
>> sh, bash, rbash, dash
방법2 - /bin 에서 'sh ' 가 포함된 파일을 조회 (shell 은 이름에 sh 포함시킴)
ls *sh* -l
>> bash, dash (link 는 제외하고 생각)
* 주의
sh 실행시 sh 는 dash 에 링크된 것이므로 dash 가 실행되고 있다!!
Shell script
- Command 의 Batch 화를 위해 사용됨 (실행할 command 를 나열한 것)
- comment (주석)
- '#': 일반 comment
- '#!': shebang (특수 Symbol)
- shell script 를 실행할 shell 의 종류를 명시!! (어떤 문법으로 쓸 지 설정)
- 단, Commend line 이 우선권이 있으므로 실행 시 다른 shell 을 이용한 명령을 주면 안 됨!!!
- sebang 을 보고 실행시키는 것이 상식!!!
#!/bin/bash
date
who
- 확장자
- 일반적으로 .sh 로 설정하지만, linux 에서는 굳이 확장자가 없더라도 permission 만 정확하면 실행할 수 있다.
- .sh 를 쓰는 이유: 구분하기 위해
- 만들기
- linux 에서 gedit 로 만들기만 하면 권한이 없는 상태이므로 반드시 permission 을 부여해주고 실행 하자
- subshell
- shell 파일은 log-in shell 이 아닌 subshell 에서 실행된다
- 예시1
- sh .bashrc: subshell 에서 실행됨 >> log-in shell 에 적용되지 않음
- source .bashrc: log-in shell 에서 실행 >> log-in shell 에 적용됨 (alias aa='ls -a' 추가)
- 예시2
- my_name 이라는 변수를 terminal 에서 선언 (log-in shell)
- 04.user_var.sh 를 통해 my_name 을 선언 (sub shell)
- 서로 영향을 주지 않음 >> log-in shell 의 my_name 값은 유지됨!!
- 리눅스 종료 상태 ($?) 코드 (p161)
- 쉘 명령어 실행 결과를 표시하는 변수
- log-in shell 에 지정된 환경 변수
코드 | 설명 |
0 | 명령이 성공적으로 완료됨 |
1 | 일반 알 수 없는 오류 |
2 | 쉘 명령을 잘못 사용함 |
126 | 명령을 실행할 수 없음 |
127 | 명령을 찾을 수 없음 |
128 | 잘못된 종료 매개변수 |
128+x | 치명적인 오류로 리눅스 신호 x를 포함 |
130 | ctrl+c 로 명령이 종료됨 |
255 | 범위를 벗어난 종료 상태 |
Shell Variables (쉘 변수)
- Shell 은 시스템의 특정 정보를 추적하기 위해 변수를 유지 관리한다
- 변수 값을 사용하고자 하는 경우: $<name> 으로 사용
- 변수 삭제: unset <name>
- 스페이스 바를 포함하는 여러 단어를 변수에 저장할 때: " " 를 사용
- 사용자 변수
- shell script 는 변수 값에 사용되는 데이터 유형을 자동으로 결정한다
- shell script 내에서 정의된 변수는 shell script 의 수명 내내 값을 유지하지만 완료되면 삭제된다
- 환경 변수
- shell 이 특별히 관리하는 변수
- 시스템 이름
- 시스템에 로그인한 사용자 이름
- 사용자 UID 등등
- 사용 가능한 활성 환경변수 목록 출력
- 'set'
- 기본 환경 변수
- shell 이 특별히 관리하는 변수
환경 변수 | 설명 |
HOME | 현재 사용자의 home directory |
PATH | shel 이 명령을 찾을 때 사용할, 콜론으로 구분된 directory 목록 |
PS1 | 기본 shell command line interface prompt 문자열 |
PS2 | 보조 shell command line interface prompt 문자열 |
BASH | 현재 bash shell 의 인스턴스를 실행하기 위한 전체 경로 이름 |
BASH_VERSION | bash shell 의 현재 인스턴스의 버전 번호 |
BASHPID | 현재 bash shell 의 인스턴스의 프로세스 ID |
HISTFILE | shell 의 히스토리 목록을 저장하는 파일의 이름 (.bash_history) |
HISTFILESIZE | 히스토리 파일에 저장되는 줄의 최대 수 |
HISTSIZE | 히스토리 파일에 저장되는 명령어의 최대 수 |
HOSTNAME | 현재 호스트의 이름 |
HOSTTYPE | 호스트 머신의 유형 |
OSTYPE | shell 이 실행되고 있는 운영체제의 유형 |
LANG | shell 의 로케일 범주 |
PWD | 현재 작업 디렉토리 |
SHELL | Bash shell 의 전체 경로 이름 |
SHELLOPTS | 사용할 수 있는 bash shell 의 옵션 목록으로 콜론으로 구분됨 |
UID | 현재 사용자에 대한 숫자로 된 실제 사용자 ID |
PPID | Bash shell 의 부모 프로세스의 ID (PID) |
LINES | 터미널에서 사용가능한 줄의 수 |
IFS | 쉘이 텍스트 문자열을 분할할 떄 사용하는, 필드를 구분하는 문자들의 목록 |
'개발자라면? > Linux' 카테고리의 다른 글
Make 빌드 시스템 2 (0) | 2022.09.02 |
---|---|
Make 빌드 시스템 1 (0) | 2022.09.02 |
라이브러리의 동작과 제작 (0) | 2022.09.02 |
GNU (0) | 2022.09.02 |
리눅스 아키텍처와 명령어 (Ft. file system) (0) | 2022.09.01 |