티스토리 뷰
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년에 인기. 커스터마이징.
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개 코어 사용
'프로그래머스 자율주행스쿨' 카테고리의 다른 글
TIL 20.12.16 - sed, awk, debugging shellcheck (0) | 2020.12.16 |
---|---|
TIL 20.12.15 - stdio, adv expressions, REGEX, PCRE (0) | 2020.12.15 |
리눅스 Midterm (0) | 2020.12.13 |
TIL 20.12.11 - File System, (0) | 2020.12.11 |
TIL 20.12.10 - Package Manager, APT, 리눅스 네트워크 시스템 (0) | 2020.12.10 |
- Total
- Today
- Yesterday
- python3
- VMware
- 코드리뷰
- ROS
- Mount
- 리눅스
- Python
- 윈도우 복구
- 8자주행
- C++
- Publisher
- vue/cli
- 아두이노 IDE
- umount
- filesystem
- roslaunch
- 우분투
- 포트인식문제
- 원격 통신
- HC-SR04
- 초음파센서
- 프로그래머스
- 윈도우
- set backspace
- VirtualBox
- 백준알고리즘
- sensehat
- Ubuntu16.04
- subscriber
- Ubuntu20.04
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |