
오픈 소스 비영리 기관 'Open Source Initiative'의 로고. https://opensource.org/
본 글은 학교 '오픈소스 소프트웨어 입문' 과목을 수강하며 실습(또는 공부)한 내용을 정리한 글입니다.
개인 기록 용도로 작성한 글이라, 직접 이 글을 보고 실습을 따라하기엔 어려움이 많을 것으로 예상됩니다.
혹시 본 글을 보며 Linux를 공부하실 목적이라면, 일단 키워드 위주로 AI에게 물어봐가면서, 본인의 Linux 터미널에서 직접 타이핑해가며 공부하시기를 추천드립니다.
질문이나 의견이 있다면 자유롭게 댓글 달아주세요!
# Lecture 04 : Execution and Function
### 다시 Quote Overview으로 돌아가서,
저 세미콜론 저런 거는 나와도 쉽게 나올거다.
세미콜론은 sequential excution임. 앞에서부터 뒤로, 차근차근 실행됨.
foss110@ajousw:~/lab0408$sleep 2; echo "2 sec"
2 sec
2초 기다렸다가 2 sec하고 출력됨.
근데, 백그라운드 작업 돌리는 게 &잖음.
sleep 2 & ; echo "2 sec" 하면 어케돼요?
-> 에러 뜸.
다음처럼 묶어줘야 하는데, braces로, 여기서부턴 그냥 외워라.
리눅스에서 명령어들을 braces로 묶을 때는, 무조건 세미클론으로 묶어야 함.
{ sleep 2 & ;} ; echo "2 sec"
-> 여전히 에러 뜸.
교수님도 일단 포기. 넘어감.
저거 & 할 땐 ; 못 씀. 굳이 하려면 이렇게 해야 함.
sleep 2 &
wait
echo "2 sec"
### 그래서 저 {;}를 왜 써야함?? 저걸 써야하는 이유)
echo A ; echo B ; echo C
하면 A B C 결과가 개행되며 출력될 거임.
근데, echo로 -n 옵션 주면, 개행이 안들어감.
! 중간고사 !
echo -n A ; echo -n B ; echo -n c 결과?
foss110@ajousw:~/lab0408$ echo -n A ; echo -n B ; echo -n C
ABCfoss110@ajousw:~/lab0408$
그냥 ABC 뜨게 됨.
근데, 저 결과 ABC를 abc.txt로 리다이렉션하고 싶으면?
일단 이렇게 시도해볼 수 있음.
echo -n A ; echo -n B ; echo -n C > abc.txt
foss110@ajousw:~/lab0408$ echo -n A ; echo -n B ; echo -n C > abc.txt
ABfoss110@ajousw:~/lab0408$
그러나 이러면 abc.txt에 C만 들어감. 따라서 {;}를 써야 함.
{echo -n A ; echo -n B ; echo -n C} > abc.txt
foss110@ajousw:~/lab0408$ { echo -n A ; echo -n B ; echo -n C } > abc.txt
> }
ABfoss110@ajousw:~/lab0408$ cat abc.txt
C }
이렇게 하니까 저렇게 }로 내가 직접 닫아줘야 함.
즉, echo 명령이 저걸 ;가 없으면, }가 나올 때까지 계속 표시하게 됨.
따라서 {}가 아닌, {;}로 끝에 ;를 넣어줘야 함.
그리고, 저렇게 내가 }를 넣어주게 되면
{ echo -n A ; echo -n B ; echo -n C } >abc.txt; }
윗 방향키로 확인하면 위 명령어를 입력한 것으로 취급됨.
즉, 세 번째 echo가 "C }"를 abc.txt에 입력한 걸로 쳐지고,
실제로도 abc.txt에 "C }"가 들어가 있음.
저기서 맨 마지막 ;는 쉘이 알아서 추가해준 느낌. 난 }만 쳤지만.
아마 >에서 엔터 칠 때마다 ;를 추가해주는 듯함.
즉, 이미 ;를 내가 기존에 명령어 입력할 때 입력했던 부분까지는 정상 실행되도록 처리되고,
그 다음에 ;가 없는 부분의 다음부분부터 내가 >에 추가로 입력하는 게 ;로 이어지는 거임.
이거 직접 해보면 감 옴.
foss110@ajousw:~/lab0408$ { echo -n A ; echo -n B ; echo -n C ; } > abc.txt;
foss110@ajousw:~/lab0408$ cat abc.txt
ABCfoss110@ajousw:~/lab0408$
결국 이렇게 해주면 정상적으로 작동함.
참고로, 교수가 여기서 계속 대문자로 변수들을 쓰는 이유는,
만약 if=1024 해버리면 if문이 작동을 안함. bash는 그게 됨.
그래서 IF 이렇게 하는 거. 실수 방지 위해.
foss110@ajousw:~/lab0408$ LONG="abcabcabc
> 123
> 123
> 123
> "
이런 경우는, 이렇게 따옴표를 닫아줘야함.
# Execution Grouping
! 중간고사 !
ls 명령과 ps 명령을 쳤다. 두 명령어의 결과물을 모두 result.txt에 저장하도록 한 줄로 작성하시오.
만약 한 줄로 라는 말이 없었으면,
ls > result
ps >> result
하면 됨.
근데 한 줄로 하면 다음과 같음.
{ ls ; ps ; } > result.txt
리눅스에서 time 은 명령어 실행 시간을 측정할 때 사용함.
출력 의미
real 실제 벽시계 상 소요 시간 (명령 내리고 결과 받기까지 걸린 시간, 총 소요 시간)
user CPU 가 사용자 모드에서 사용한 시간 (내 코드가 직접 계산한 시간)
sys CPU 가 커널 모드에서 사용한 시간 (OS 가 대신 처리한 시간, 예: 파일 읽기)
foss110@ajousw:~/lab0408$ time sleep 1
real 0m1.001s
user 0m0.001s
sys 0m0.000s
즉, 실제로 저 sleep 1 명령어를 실행하는 데, CPU는 별로 사용하지 않았다는 거임.
foss110@ajousw:~/lab0408$ time sleep 1; sleep 2; echo done
real 0m1.001s
user 0m0.001s
sys 0m0.000s
done
이러면 앞에 거만 나오잖음.
그러면 묶어서 하려면, {;} 써야 함.
foss110@ajousw:~/lab0408$ time { sleep 1 ; sleep 2 ; echo done ; }
done
real 0m3.001s
user 0m0.001s
sys 0m0.000s
이러면 실제로 걸린 시간이 3초 걸리는 거 볼 수 있음.
또는 time { sleep 1 ; sleep 2 ; } ; echo done
얘는 time 출력 다음에 done이 출력됨.
## {;}와 () 비교
### 1. {;} - 현재 쉘에서 실행
time { sleep 1 ; ps -l ; sleep 2 ; echo done ; }
foss110@ajousw:~/lab0408$time { sleep 1 ; ps -l ; sleep 2 ; echo done ; }
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 3110 206157 206156 0 80 0 - 2103 do_wai pts/76 00:00:00 bash
0 R 3110 209474 206157 0 80 0 - 2202 - pts/76 00:00:00 ps
done
real 0m3.023s
user 0m0.010s
sys 0m0.013s
### 2. () - 서브 쉘에서 실행
time ( sleep 1 ; ps -l ; sleep 2 ; echo done )
foss110@ajousw:~/lab0408$ time ( sleep 1 ; ps -l ; sleep 2 ; echo done ; )
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 3110 206157 206156 0 80 0 - 2103 do_wai pts/76 00:00:00 bash
1 S 3110 209644 206157 0 80 0 - 2103 do_wai pts/76 00:00:00 bash
0 R 3110 209654 209644 0 80 0 - 2202 - pts/76 00:00:00 ps
done
real 0m3.043s
user 0m0.008s
sys 0m0.023s
보면, ps 결과에 bash가 들어가있는 걸 볼 수 있음.
-> 굳이 배운 거에 대응시키면, braces는 source로 실행시킨 것에 대응되고, ()는 bash로 실행시킨 것에 대응됨.
# Execution
touch a
echo AAA > a
### ;의 경우
foss110@ajousw:~/lab0408$ ls a ; cat a
a
AAA
foss110@ajousw:~/lab0408$ ls b ; cat b
ls: cannot access 'b': No such file or directory
cat: b: No such file or directory
### &&의 경우
foss110@ajousw:~/lab0408$ ls a && cat a
a
AAA
foss110@ajousw:~/lab0408$ ls b && cat b
ls: cannot access 'b': No such file or directory
### ||의 경우
foss110@ajousw:~/lab0408$ ls a || cat b
a
foss110@ajousw:~/lab0408$ ls a || cat a
a
여기서 핵심은,
;는 앞에 꺼가 참이든 거짓이든 뒤에 꺼 실행.
&&는 앞에 꺼가 참이어야만 뒤에 꺼 실행.
||는 앞에 꺼가 거짓이어야만 뒤에 꺼 실행.
! 중간고사 !
foss110@ajousw:~/lab0408$ ls b || echo BBBB > b
ls: cannot access 'b': No such file or directory
foss110@ajousw:~/lab0408$ ls
a abc.txt b hello2.sh hello.sh result.txt
foss110@ajousw:~/lab0408$ cat b
BBBB
저거 앞에 꺼가 거짓이니까, 뒤에 echo가 실행된 거임.'Tools & Utilities > Linux & Server' 카테고리의 다른 글
| [Shell Script 실습] Ch4. \$ 확장과 특별한 값들(\$ expansion and special values) (0) | 2025.04.16 |
|---|---|
| [Linux] Windows 11에서 WSL2 설치하고 VSCode 연동하기 (0) | 2025.04.14 |
| [Shell Script 실습] Ch2. 따옴표와 변수 설정(Quote and Variable) (0) | 2025.04.10 |
| [Shell Script 실습] Ch1. 배쉬 쉘 스크립트 기초들(Bash Shell Script Basics) (0) | 2025.04.09 |
| [Linux 실습] Ch10. 디스크 유틸리티들(Disk Utilities) (0) | 2025.04.09 |