Linux Command and Redirection
Computer Science/OpenSource+Git

Linux Command and Redirection

# Bash Option

- set -o/+o 또는 shopt -s/-u를 통해서 built-in 커맨드들을 껐다 켰다 할 수 있다.

내장 커맨드들을 껐다 켰다 할 수 있다. ctrl^d를 무시하는 ignoreeof를 끈 것을 확인할 수 있다.

 

#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 내용이 파일에 잘 저장된 것을 사용할 수 있다.

+) 정상적인 출력과 error 메세지를 구별하기 위해 1>와 2>를 함께 사용할 수도 있다.

표준 출력은 output으로, error는 error 파일로 redirection되었다.

 

+) 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