스터디 : 리눅스 커맨드라인 쉘 스크립트 바이블 5장

호밀빵 굽는 쿼카·2022년 7월 29일
0

목차

1) 쉘 유형

2) 부모-자식 쉘

3) 프로세스 목록으로 서브 쉘 생성

4) 서브 쉘을 창의적으로 사용하기

  • 백그라운드모드+서브쉘
  • 코프로세싱

5) 외부 명령어와 내장 쉘 명령어

  • cd,exit,echo,pwd,history,alias ,,

쉘 유형

기본 GNU bash 쉘

$ cat /etc/passwd
...:/bin/bash

/bin/bash 는 실행시킬 수 있는 프로그램

참고로 C 쉘을 기반으로 한 것은 /bin/tcsh*



부모-자식 쉘의 관계

bash 입력 시, 자식쉘(서브쉘)로 접속

서브쉘 아래 서브쉘 아래 서브쉘,, 생성 가능합니다. 아래 명령어로 서브쉘들이 어떻게 구성되어있는지 확인 가능합니다.

ps --forest

PID는 본인(자식)의, PPID는 부모 PID를 나타냅니다.



프로세스 목록 보기

프로세스 목록 사용 = bash 쉘 명령이나 쉘 스크립트를 실행하지 않고도 서브 쉘을 만드는 방법

1. 순차적으로 실행될 명령 목록 한 줄 지정하기

$ pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls
$ pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls ; echo $ZSH_SUBSHELL


출력 0

2. 순차적으로 실행될 명령 목록 한 줄 지정하고 괄호로 감싸기

$ (pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)

차이가 없어보이지만, 괄호를 더해 명령목록을 프로세스 목록으로 바꾸면 명령은 서브쉘에서 실행

$ ( pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls ; echo $ZSH_SUBSHELL )

출력 1

$ ( pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls ; (echo $ZSH_SUBSHELL ) )

출력 2 : 서브쉘 안의 서브쉘



서브쉘을 창의적으로 사용하기

대화형 쉘에서 서브쉘을 사용하는 생산적인 방법 1

1. 백그라운드 모드란?

1) ps 명령어로 확인

2) jobs 명령어로 확인

-l 옵션으로 PID도 확인 가능!

2. 프로세스 목록을 백그라운드 모드로 돌리기(서브쉘+백그라운드)

$ (sleep 2 ; echo $ZSH_SUBSHELL ; sleep 2)

백그라운드 모드에서 프로세스 목록을 사용하는 것은 서브 쉘 안에서 많은 양의 작업을 처리하면서도 터미널이 서브쉘의 입출력에 발목이 잡히지 않아도 된다는 장점

3. 프로세스 목록을 백그라운 모드로 돌리는 실용적 예시

$ (tar -cf Rich.tar / home/rich ; tar -cf My.tar /home/christine)&

tar로 백업파일을 만드는 작업은 백그라운드 프로세스 목록을 효과적으로 사용하는 사례


대화형 쉘에서 서브쉘을 사용하는 생산적인 방법 2

1. 코프로세싱 사용하기

코프로세싱이란?

  • 2가지 작업을 동시에 수행하는 것
  • 백그라운드 모드에서 서브쉘을 생성하고 서브쉘에서 명령 실행
  • 코프로세싱 실행법 : 서브쉘에서 실행해야할 명령 + coproc 명령
  • 코프로세싱은 서브쉘을 생성한다는 사실만 제외하면 백그라운드 모드에서 명령 돌리는 것과 동일하게 동작

❗️주의할점❗️
MAC에서는 coproc 명령어 지원이 안되기 때문에, 운영서버에서 테스트

1) 기본 명령어

$ coproc sleep 10

2) 이름 지정 가능

$ coproc My_JOB { sleep 10; }

3) 심화 명령어 (코프로세싱 + 프로세스목록)
여러단계의 서브쉘을 생성시킬 수 있음

$ coproc ( sleep 10; sleep 2 )



내장 쉘 명령어

1. 외부 명령

외부 명령 위치 : /bin,/usr/bin,/sbin,/usr/sbin

$ which ps
$ type -a ps
$ ls -l /bin/ps


2. 외부 명령 '포크'란?

외부 명령이 실행될 때마다 자식 프로세스가 생성되는데, 이런 동작을 '포크'라고 합니다. ps는 외부 명령이므로 명령이 실행될때, 자식 프로세스가 생성됩니다.프로세스가 포크를 해야할때마다 새로운 자식 프로세스의 환경을 설정하려면 시간과 자원이 들어가 외부 명령은 자원 소모가 많을 수 있습니다

내장된 명령을 사용할때에는 포크가 필요없어서 자원 소모가 적음


3. 내장 명령

내장된 명령을 사용할때에는 포크가 필요없어서 자원 소모가 적음
내장된 명령은 쉘과 함께 컴파일되므로 쉘의 여러 기능 가운데 일부를 이루고 있음

cd, exit 명령은 내장 명령

$ type cd
cd is a shell builtin
$ type exit
exit is a shell builtin

4. 외부+내장 명령

type -a 으로 명령의 여러가지 특성을 보기

$ type -a echo
$ which echo
$ type -a pwd
$ which pwd


type -a명령을 사용하면 두 명령 각각에 대한 두가지 유형을,
which명령은 외부 명령 파일만을 보여줍니다.


5. history 명령 사용해보기

1) history명령 사용하기 : 최근 사용된 명령의 목록 보기

2) !!로 마지막 명령을 불러들이고 재사용하기

3) .bash_history 파일

명령 히스토리는 사용자의 홈 디렉토리에 있으면서 보이지 않는 .bash_history 파일에 보관됩니다.

하지만 실제 history 명령과 cat ./bash_history 로 파일내용을 보면 결과가 다르다는 것을 알 수 있습니다.

이유는, bash 명령 히스토리는 메모리에 저장된 다음 쉘에서 나갈 때 기록 파일에 저장합니다. 그러므로 현재 쉘에서 사용된 명령어는 나오지 않는 것이 정상~!!

참고로, 강제로 .bash_history 파일에 기록하고 싶다면 history -a 명령어 사용하면 가능합니다.

4) !(번호)로 history 목록의 명령을 바로 실행시키기


6. 명령의 별명 사용하기

사용할 수 있는 별명의 목록 보기

내가 작성한 alias 설정에 관한 글

❗️주의할 점❗️
별명 값을 정의하면 그 명령이 정의 되어 있는 쉘 프로세스에 대해서만 유효

profile
열심히 굽고 있어요🍞

0개의 댓글