# Bash Option
- set -o/+o 또는 shopt -s/-u를 통해서 built-in 커맨드들을 껐다 켰다 할 수 있다.
#Linux Command
- compgen은 Linux에서 실행되는 모든 command를 리스팅하는 커맨드이다.
1) compgen -c : 현재 실행 가능한 모든 커맨드를 리스트업한다.
2) compgen -a : 모든 alias(별칭/ 어떤 명령어나 함수보다도 우선순위가 높다)를 리스팅한다.
3) compgen -k : 모든 bash keyword 를 리스팅한다.
4) compgen -A function : 모든 bash function을 리스팅한다.
5) compgen -b : 모든 bash built-in들을 리스팅한다.
EX) compgen -c | wc -l 을 조합해 명령어의 개수를 출력할 수 있다.
- command를 중복해서 사용할수 있으므로 우선순위를 알아야 한다.
: bash alias-> keywords-> functions -> built-ins -> $PATH (외부 명령어) 순으로 우선순위가 낮아진다.
-> 밑 그림을 확인하면 alias가 가장 우선순위가 높고, function - built-in- PATH 순으로 우선순위가 낮다.
#Built-in VS External Commands
1) Built-in
: 이는 shell program에 내장되어있는 command를 의미한다.
- bash는 pwd, echo,cd등을 참조 없이 곧바로 실행한다.
- cd는 반드시 built-in command여야 한다. 아니면 문제가 발생하는데, 밑 그림에서 확인해보자.
-> cd가 만약 외장명령어라면, cd를 실행하는게 자식 프로세스이므로 부모 프로세스에서는 이가 반영이 안된다.
2) External Command
: Bash는 외장 명령어를 실행하기 위해 PATH의 디렉토리들을 검색한다.
- directory 이름의 set들은 colon으로 분리된다. EX) /usr/bin:/bin
#Command List
-> 하나 혹은 그 이상의 작업들은 ; 또는 & 로 분리될 수 있다.
; 는 순차적으로 명령어를 실행하며, &는 커맨드들을 병행적으로 실행한다.
#Exit Status
: 프로그램은 0~255까지의 exit status를 반환한다.
1) 0은 항상 success를 의미한다
2) Nonzero는 error를 의미한다.
: bash는 번호가 N인 fatal signal가 발생할때, 128+N를 exit status로 사용한다.
-> exit status를 출력하기 위해 $? parameter에 저장해둔다.
: 이 exit status는 bash conditional commands에 자주 사용된다.
#Conditional Command list
: list는 sequence들을 조건하에 실행한다.
: &&, ||가 대표적으로 사용되는 command이다.
1) &&: 이는 앞의 cmd가 모두 성공해야 뒤의 cmd가 실행된다.
2) || : 이는 앞의 cmd가 실패하면 뒤의 cmd를 실행된다.
# Command Group
- (cmd1; cmd2; cmd3; ...)
: ( ) 안의 list들은 child/subshell에서 실행된다.
: child shell은 command group을 parse한다.
-> {}로 묶어진 command group은 그대로 parent shell에서 실행된다.
-> ( )를 마주하는 순간 shell은 child shell을 만들며, 거기에서 command를 실행하낟. 따라서 부모 프로세스에서는 bin이 생성되지 않았다.
# Standard Input/Output
1) File Descriptor
: 이는 directory나 device를 포함한 file에 할당된 정수이다. 여러가지 I/O device들을 추상화했다.
- 각 프로세스는 file descriptor를 file을 열기 위한 인덱스로 사용하고, file descriptor table을 갖고 있다.
- 각 프로세스는 standard POSIX file desciptor
1) fd 0 : keyboard로 부터 표준 입력을 의미한다.
2) fd 1: screen으로의 표준 출력을 의미한다.
3) fd 2: screen으로의 표준 에러를 의미한다.
2) Standard Input Redirection
: standard input 'keyboard' 대신에 어떤 특정한 파일로부터 read하기 위해서 사용한다.
-> 이를 위해선 redirection symbol '0<'를 사용해야 한다. cin<<을 기억하면 쉽다.
-> 각각 표준 입력 대신에 users, calc.txt 파일로부터 결과를 읽어오는 것을 확인할 수 있다. < 로도 사용할 수 있다.
+) wc는 word count, bc는 basic calculator, 계산기를 의미한다.
3) Standard Output Redirection
: standard output을 file로 리다이렉션 하기 위해 사용하며, '1>'이란 redirection symbol을 사용한다.
- 파일에 이미 내용이 존재하면 삭제가 된다.
- append하기 위해선 '1>>'를 사용해야 한다.
4) Standard Error Redirection
: Standard error를 특정한 파일로 redirecting하며, "2>"를 사용한다.
+) 정상적인 출력과 error 메세지를 구별하기 위해 1>와 2>를 함께 사용할 수도 있다.
+) input과 output redirection을 조합할 수 있다.
wc가 infile로부터 input을 받고, outfile로 출력하는 것을 확인할 수 있다.
+) output과 error를 같은 파일에 출력 할 수 있다.
&>, 2>&1은 같은 역할을 하는 커맨드이다. error를 fd1의 stream으로 바꾼다는 의미이다.
- output이나 error message를 보고 싶지 않은 경우에는 /dev/null 파일로 redirecting하면 된다.
: ls a b> /dev/null 2>&1를 사용하면 모든 메세지가 소각된다.
'Computer Science > OpenSource+Git' 카테고리의 다른 글
Conditional Construct (0) | 2021.12.11 |
---|---|
Pipe and Shell Scripts (0) | 2021.12.11 |
shell command 확장과 명령어 치환 (0) | 2021.12.11 |
Shell Environment (0) | 2021.12.11 |
Git Branch Command (0) | 2021.10.24 |