wait, shift, select

markyang92·2021년 9월 3일
0

shell-script

목록 보기
15/19
post-thumbnail

wait

  • wait 명령은 child process가 실행 종료 후, 자원 반납까지 기다린다.
  • 기본적인 wait 사용
#!/bin/bash
for ((i=0; i<3; i++)); do
    (
        echo $((10-i))
        sleep $((10-i))
    )&
done

wait # 여기서 위에서 실행한 child process가 전부 종료되길 기다린다.

wait -n

  • wait-n 옵션을 붙이면, child process 1개 기다리고 그 process의 return 값을 return 한다.
#!/bin/bash
for ((i=0; i<3; i++)); do
    (
        echo $((10-i))
        sleep $((10-i))
    )&
done

wait -n # 제일 빨리 끝나는 child process 하나 기다리고
echo $? # 반환 값 출력

wait -n
echo $? # 반환 값 출력

wait -n
echo $? # 반환 값 출력

  • thread run, join과 비슷

$! 사용 시 주의

  • $!는 항시 제일 늦게 '실행한' child pid만을 가지고 있음

| while read line 실행 문제

  • | pipe 로 연결된 명령들은 subshell에서 실행된다!!!
    따라서 | PIPE 연결한 명령의 & (bg) 실행은 밖 wait에서 안기다린다!
cat ${COMMAND_FILE} | while read line; do 
   eval "${line} do something" &
done
wait # 그냥 끝남
  • 해결책: 본인은 awk를 이용하는 편이다.

awk 를 이용해 많은 양 처리하자

LINE_NO=$(cat 'file' | wc -l) # 몇 줄 라인인지 읽음
for ((i=1; i<=${LINE_NO}; i++)); do # 반드시 1 <= LINE_NO 임을 명심
    THIS_LINE=$(awk "NR==$i" ${COMMAND_FILE})
    "많은 양 처리" & # 백그라운드 실행
done
wait # 백그라운드 기다림

shift

  • shift 명령은 $1이 보는 것을 오른쪽으로 옮기는 것이라 보면됨
  • shift 는 현재 설정되어 있는 positional parameters를 오른쪽만큼 n 이동
    • default: 1
  • 결과: n 개의 positional parameters가 삭제된다.
    • 따라서 $1이 담고 있는게 지정한 n 만큼 이동한 것을 가리킨다.
  • 예외 상황: 현재 positional paramters 개수보다 n 값이 크면, 삭제가 일어나지 않고 종료 상태 값은 1이된다.
$ ./script 11 22 33 44 55
#!/bin/bash
echo $@ 
11 22 33 44 55
        # 11 22 33 44 55
        #  ↑
        #  1번 parameter에 positional parameter

shift 2 
# 11 22 33 44 55
#  ↑
# 오른쪽 2칸 이동
# 11 22 33 44 55
#        ↑


echo $@ 
33 44 55

계속 shift 하면
echo $@ 해도 empty
while [ $# -ne 0 ]; do
	echo "$#" "$1" "`which $1`"
    shift # 위치 파라미터 이동
done

$ ./script ls vi sed
3 ls /bin/ls
2 vi /usr/bin/vi
1 sed /bin/sed
-> $# == 0 -> 종료


select

  • select 문을 사용하여 메뉴를 쉽게 생성할 수 있다.
select CMD in ls vi sed
do
	echo "You selected $CMD ($REPLY)"
done
1) ls
2) vi
3) sed // 메뉴가 표시되고 #? 표시 후, 입력 대기
#? 1
You selected ls (1)
#?
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글