Redirection and Pipe(Week 4-1)

G·2022년 10월 5일
0

2-2 OpenSource

목록 보기
3/12
post-thumbnail

Redirection and Pipe

이번에 배우는 Redirection과 Pipe에 대한 자세한 내용은 따로 배우지 않았기에 입출력에 관한 내용이란 것만 숙지하고 명령어에 대해 알아본다.

compgen command

  • -c: 실행 가능한 모든 명령어를 출력
  • -a: alias만 출력
  • -A function: bash functions을 모두 출력
  • -b: built-ins를 모두 출력

Alias

Alias는 command에 또 다른 이름을 붙여주는 것이다.

  • $ alias //최근에 설정한 aliases 출력
  • $ alias name=command //생성
  • $ unalias name //해제

Shell Functions

다양한 커맨드를 하나의 함수 이름을 사용해 사용할 수 있는 기능을 제공해준다.

  • 모듈화와 가독성의 이점이 있다.
  • 일반적인 커맨드와 같이 실행된다.

선언

  • name(){ commands; }
  • funnction name(){ commands; }

매개변수
Shell 함수의 매개변수는 선언부 안에 작성한다. $1은 첫 번째 매개변수를 의미한다.

  • name(){ echo $1; echo $2;} //선언 시
  • name paramete($1) //호출 시

반환
프로그래밍 언어와 다르게 리턴 값은 숫자가 아닐 경우 exit status로 사용된다.
exit status란 함수가 정상적으로 작동 되었는지를 확인한다.
linux는 0이면 정상, 1이면 비정상을 의미한다.
숫자일 경우 리턴 값을 다른 곳에 사용하는 것 같다.
$?이란 직전에 사용된 커맨드의 exit status를 의미한다.
함수일 경우엔 return value가 숫자일 경우 숫자 값이, 숫자가 아닐 경우
exit status가 반환된다.
PC로 확인해본 결과 숫자가 아닐 때 비정상적 excution으로 2가 출력된다.

$ f3(){ local ret=$(( $1 + $2 )); return $ret; }
$ f3 3 4
$ echo "The answer is $?"
The answer is 7

C++에서 main 함수 마지막에 return 0을 작성해주는 이유이기도 하다.

A Simple Shell

linix terminal 명령어 동작에 대해 알아보자

int main(){
	loop : $출력
	입력된 line을 읽음
	입력값을 quoting('' "") 규칙을 적용해 명령어들로 나눔 (alias expansion)
	1. 우선순위가 가장 높은 명령어(ls)
	2. 함수 호출
	3. built-in 명렁어 호츌 (fork/exec x)
	4.if 커맨드가 $PATH에 존재시
		if(fork() == 0) //새로운 프로세스 실행(자식) 
		exec(); //현 프로세스에 새 프로스세스 복사(두 프로세스간 공유)
	if(last char != '&'){ //자식 프로세스 &은 background 실행 
		wait(); //foreground 진행이므로 끝날 때까지 대기
		goto loop; //loop로 돌아감
	}
	else goto loop; //background 실행 명령어 재개
  • Built-in: Bash에서 실행이되며, 자식프로스세가 새로 실행되어도 영향을 받지 않는다.
  • External: fork/exec 발생

명령어 우선순위

Alias -> Keywords -> Functions -> Built-in -> External

Background Job

만약 "명령어 &" 형식으로 실행된다면 기다리지 않고 명령어 입력을 재개할 수 있다.
즉, 자식 프로세스가 끝날 때까지 기다리지 않아도 된다는 것이다.
이것의 반대는 Foreground Job이다.
만약 $ sleep 100을 실행한다면, 100초간 다른 명령어를 실행할 수 없다.

Command List

;, & 두 가지의 문자를 이용하여 foreground와 background job을 나누어 한 줄에 해결할 수 있다.

  • $ date ; sleep 1 ; sleep 1 ; sleep 1 ; date

위의 내용은 두 번의 date 출력 사이에 3초가 흐를 것이다.

  • $ date ; sleep 1 & sleep 1 & sleep 1; date

두 번의 date 출력 사이에 1초가 흐른다. 즉,

  • ;는 fore, &는 back이다.

비슷한 문법으로 ()안에 명령어 2개 이상을 작성한다면 left->right 순서로 명령어가 실행된다.

Conditional Command List

프로그래밍 언어의 조건문과 같이 명렁어를 실행 할 수 있다.

  • cmd1 && cmd2: cmd1이 성공 시 cmd2 실행
  • cmd1 || cmd2: cmd1이 실패 시 cmd2 실행
profile
열심히 안 사는 사람

0개의 댓글