티스토리 뷰

1강 : bash

공식 문서: www.gnu.org/software/bash/manual/bash.html

 

Bash Reference Manual

 

www.gnu.org

Shell (셸) : Application을 실행시키는 도구.

하드웨어를 제어하기 위해서 kernel이 존재.

OS의 커널에 일반유저가 직접 접근할 수 없기 때문에, 어플리케이션을 실행시켜서 어플리케이션과 커널이 통신을 하기 위해서 중간 매개체인 셸이 필요하다.

 

History of Shell

Bourne shell (본셸) : = POSIX shell.   /bin/sh

C shell (씨셸) : /bin/csh

Korn shell (콘셸) : 씨셸과 본셸의 장점을 모두 갖고 있다.   /bin/ksh

Bourne-again shell (배시셸) : /bin/bash   콘셸을 벤치마킹했다. 많은 부분을 built-in cmd로 대체 -> fork-exec 횟수 감소 -> 성능 향상.

Z shell (지셸) : 1990년도에 개발되었는데 2020년에 인기. 커스터마이징.

 

Special character. 특수문자.

 

prompt: input mode

입력기

내가 프롬프트창에서 명령어 입력 및 실행하는 것은 큰 텍스트 파일이 하나 있고, 그 파일 내에서 한 줄을 입력하고 실행하는 것.

프롬프트 창에서 쓸 수 있는 단축키 모음.

이전 명령어의 맨 뒤 문자열을 다시 써야할 때 : <ALT-.

이전 명령어의 argument를 다시 불러오는 것 :

![i]:n : i번째 히스토리 명령어의 n-th argument. i를 생략하면 이전 명령어에서 가져온다.

!:n-m : 이전 명령어의 n~m -th argument list를 리턴.


2강 : bash shell의 작동 원리

sub-shell

셸에서 실행되는 UNIX명령어는 sub-shell이 생성되어 실행되는 것. 

sub-shell이란 fork-exec으로 만들어지는 child process 셸이다.

리턴코드 : $? 변수로 확인 가능

왜 부모 프로세스는 자식 프로세스의 exit code를 읽어야 하는가?

-> exit code를 통해 자식 프로세스가 성공했는지 실패했는지 알 수 있고, 성공했다면 다음 작업을 진행, 실패했다면 에러처리(정지)를 해야하기 때문.

sub shell을 만들어서 일을 분담하는 것은, 마치 하나의 함수를 호출하는 행위와 비슷하다.

* fork는 기본적으로 부모 프로세스의 자원을 복제하는데,

exec가 곧바로 발생하면, 새로운 프로세스 이미지를 로딩하면서 바로 이전에 fork에서 복제한 부모 프로세스의 old image자원은 곧바로 해제된다.

따라서 fork-exec 시에는 곧바로 해제할 쓸모없는 메모리 복제를 피하기 위해, 메모리 복사를 pending하는 CoW기법이 나왔다. (Copy on Write)

 

좀비 프로세스 : 부모 프로세스가 / 종료된 자식 프로세스의 exit status를 / 처리하기 전 상태. = defunct process.

프로세스 = Data + Meta Data

data : 코드

meta data : pid, exit code 등

파일 = Data + Meta Data

data : 내용

meta data : 파일 이름, 권한, 만든 시간 등. 파일에 관련된 정보.

모든 프로세스의 종료는 좀비 상태를 거쳐서 해소된다.

일반적으로 shell은 항상 자식 프로세스의 exit status를 처리하므로, 좀비가 생기는 경우는 거의 없다.

child process의 exit code 실습 : 2020/12/15 - [OS/리눅스] - Ubuntu16.04 - child process의 exit code 실습

 

Ubuntu16.04 - child process의 exit code 실습

1. C언어로 작성된 코드 예제 1) 정상범위 리턴값 make helloworld : 컴파일하는 명령어 ./helloworld : 실행파일 실행 명령어 $? : 바로 이전 명령어의 리턴 코드 가져오는 변수. 2) 리턴값 오버플로우 2340

donie.tistory.com


3강 : variables

셸변수 선언 (declaration)

[set] name=value : name이라는 변수에 value를 선언 또는 변경. [ ] 는 생략 가능하다. = 사이에 공백이 허용되지 않는다.

셸변수 표현 (expression)

${name} : 중괄호는 명확하게 변수명 구별이 가능한 경우에 생략이 가능하다. 즉, 앞 뒤 공백이 있는 경우 생략.

셸변수 삭제 (removal)

unset <name> : name이라는 변수를 삭제. 잘 사용하지는 않음.

 

셸 프로그래밍에서 공백은 문법의 일부이다. 따라서 공백을 임의로 생략하거나 넣으면 오류 발생.

 

환경 변수

셸 변수에 상속 속성을 설정.

fork하는 경우, child process에 상속됨. (복제됨)

${TERM}, $LANG 과 같이 셸 변수 표현과 똑같이 표현한다.

 

환경변수 만드는 방법 (declaration)

MY_ENV_VAR="value"; export MY_ENV_VAR

export MY_ENV_VAR="value"

declare -x MY_ENV_VAR="value"

 

built-in 환경 변수

TERM : 사용하는 터미널 종류

LANG : 로케일 정보. 명령어 출력 언어 및 문자세트 지정

환경 변수 전부 확인하는 명령어 : env

 

명령어가 너무 길 때 

export EDITOR=vim 을 수행한 후

<CTRL-X><CTRL-E>를 입력하여 명령행을 vi에디터에서 완성할 수 있다.

명령어를 저장하고 나오면 해당 명령어가 실행된다.

 

환경 변수 PATH

명령어 탐색 기능.

PATH 추가를 위해 pathmunge 셸 함수를 사용한다.

 

shell 변수는 process가 살아있는 동안 살아있다.

permanency를 제공하기 위해서는 rc(run command, runtime config)파일에 등록해야 한다.

.bashrc  vs  .bash_profile 은 invoking type에 따라서 차이가 난다.


4강 : 

bash invoking mode

Authentication 과정에 따라 login shell, non-login shell

Command-execution 방식에 따라 interactive shell, non-interactive shell

 

login shell

1. import /etc/profile (if exist)

2. ~/.bash_profile, ~/.bash_login, ~/.profile 순으로

3. 종료시 ~/.bash_logout 실행 (if exist)

 

non-login shell

1. import ~/.bashrc (if exist)

 

 

import, source

. : bourne shell 명령어

source : bash 명령어

.과 source는 같은 기능을 하는 명령어이다.

 

interactive : 직접?

non-interactive : 2시 23분


5강 : script 구조

script 파일 구조 : 관습적으로 *.sh 파일명을 가진다.

실행 셸 선언부 : #! ( 셔뱅/시뱅/쉬뱅 )으로 시작. 혹은 env로 실행 가능.

 

/bin/bash  !=  /bin/sh

전혀 다른 것이다.

 

variable : scope

전역변수 - 기본값

지역변수 : local var_name [=value]

 

true-type 폰트가 아니면 둥근 따옴표인지 아닌지 잘 안 보인다.

따옴표가 있는 행에서 에러가 나면 -> 따옴표 확인.

 

single quotes : 문자열 그 자체만을 표현

double quotes : 문자열 안의 표현식을 해석.

backslash는 meta문자를 해석을 막는 기능.

backtick( ` )은 $(...)으로 대체하는 것 추천.


6강 : 

control : if

if [ condition ]; then ... fi

[ ] 안의 condition 앞 뒤로 꼭 공백이 하나 이상 있어야 한다.

 

shell에서 어떤 파일을 불러올 때 / 실행할 때 : 해당 파일이 있는지 먼저 확인해야 함!

 

파일이 있는지 확인하는 명령어. 1을 리턴하면 없고, 0을 리턴하면 있다.=정상 종료

zero length

문자열 비교 : lexicography [[ ]]

0x: 16진수

0: 8진수

if로 시작하면 마지막에 무조건 fi로 끝나야 한다.

 

정상적으로 작동하지 않았다면 꼭 non-zero로 리턴해야 한다.

 

case로 시작하면 마지막에 무조건 esac로 끝난다.

*) 는 기타 케이스

;; 는 break 역할

 

pathmunge $1 $2


6강 : 제어 구문

while [ test condition ]

do

    command...

done

while : ; do

    command...

done

 : 을 null command라고 부른다. 이것은 0 또는 true를 의미한다.

무한루프인 경우 break로 멈출 수 있다.

expr은 외부 명령어이다.

selfdriving@u16vm:~$ expr 100 - 23
77
selfdriving@u16vm:~$ mynum=120
selfdriving@u16vm:~$ expr $mynum - 15
105
selfdriving@u16vm:~$ res=$(expr $mynum - 15)
selfdriving@u16vm:~$ echo $res
105
selfdriving@u16vm:~$ 
selfdriving@u16vm:~$ res=`expr $mynum - 15`
selfdriving@u16vm:~$ echo $res
105
selfdriving@u16vm:~$ which expr
/usr/bin/expr
selfdriving@u16vm:~$ ll `which expr`
-rwxr-xr-x 1 root root 39664  3월  3  2017 /usr/bin/expr*

 

foreach : iterator에 배열의 값이 순서대로 들어오는 방식.

for : indexing방식.

 

select : 메뉴 선택을 위한 기능

 

getopt


7강 : 확장 표현

${#name} : 변수의 길이

${name:offset:len} : 변수의 offset위치(0부터 시작)부터 길이 len길이만큼 출력. len가 음수일 경우에는 뒤에서부터 계산한다. length를 생략하면 끝까지 출력.

 

declare -i varname : varname은 int타입이다. 선언하는 것.

$varname : 정수형 변수 호출

 

declare -a varname=(value1 value2 value3 ···) : varname을 배열로 선언.

 

배열의 index자동으로 받기 : #배열이름[@] 으로 인덱싱하기

IFS:field separate의 약자

""가 있어야 공백을 처리할 수 있다.

 

아스키코드값을 모를 때는 man ascii

""감싸면

@는 리스트 배열처럼 처리

*은 문자열로 인식해서 처리


8강 : 

Special parameters

$$ : 현재 셸 프로세스의 PID

$! : 마지막으로 실행된 백그라운드 프로세스의 PID

$? : 최근 프로세스의 종료값. (0=true, otherwise=false)

$# : 인수의 개수. argc

$0, $1, $2, ··· : 인수 리스트. argv

C언어에서 int main(int argc, char **argv) 도 argc는 인수 개수, argv는 인수 리스트.

 

path = dirname + basename : dirname은 디렉토리, basename은 파일명

 

redirecting 이용

2>/dev/null 하면 오류 메세지를 보지 않고 무시. 2는 stderr.

 

압축률이 중요하면 xz

요즘 많이 쓰는 것은 zstd

gz는 아재 압축 방식.

 

물리적 코어가 10개 있다고 해서 10개를 다 쓰는 작업은 하지 않는다.

-T0 : 모든 코어 사용

-T2 : 2개 코어 사용

꼭 실습

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함