2021. 3. 6. 22:38ㆍComputer(인강)/시스템 프로그래밍
안녕하세요 bannavi입니다^ㅅ^
오늘은 쉘로 시작하는 시스템 기본 프로그래밍 기본 네번째 시간이에요
리다이렉션과 파이프에 대해 살펴보려고 하는데요,
지금 바로 시작하겠습니다
Standard Stream(표준 입출력)
1, command로 실행되는 프로세스는 세가지 스트림을 가지고 있습니다.
1) 표준 입력 스트림(Standard Input Stream) - stdin
2) 표준 출력 스트림(Standard Output Stream) - stdout
3) 오류 출력 스트림(Standard Error Stream) - stderr
2. 모든 스트림은 일반적인 plain text로 console에 출력하도록 되어 있음
리다이렉션(redirection)
1. 표준 스트림 프름을 바꿔줄 수 있습니다
2. > , <을 사용함
3. 주로 명령어 표준 출력을 화면이 아닌 파일에 쓸 때
그림만 보면 뭔소린지 모르겠다구요 네 예를 가져와 봤습니다.
예 1) ls > files.txt
1. 화면에 출력되는 내용을 파일에 저장하고 싶다는 의미
2. ls로 출력되는 표준 출력 스트림의 방향을 files.txt로 바꿔줌
(files.txt에 ls로 출력되는 결과가 저장됨)
예 2) head < files.txt
1. files.txt의 파일 내용이 head라는 파일의 처음부터 10라인까지 출력해주는 명령으로 넣어짐(files.txt의 앞 10라인이 출력됨)
직접 한번해볼게요 ls -al을 입력해봤어요
여기에서 ls -al > filelist.txt 를 다시 입력해봤습니다.
filelist.txt가 없어도 괜찮아요 다시 만들어진답니다.
음 아무것도 안나오네요? 이렇게 쳐볼게요
아하. 그럼 이렇게 filelist.txt안에 ls -al의 내용이 저장된걸 확인해볼 수 있네요
head filelist.txt를 입력하면 앞의 10줄만 출력되는 모습도 보이는데요
이걸 이렇게 입력으로도 가능합니다 head < filelist.txt
head라는 프로세스에 입력 스트림으로 넣어줘서 동작을 시킬 수도 있다는거죠 내용은 같습니다.
예 3) head < files.txt > files2.txt
1) files.txt의 파일 내용이 head로 들어가서, file,txt의 앞 10라인을 출력
2) head의 출력 스트림은 다시 files2.txt로 들어감
3) head는 files.txt 내용을 출력하지 않고, 해당 출력 내용이 다시 files2.txt에 저장됨(결과적으로 files.txt의 앞 10 라인이 files2.txt에 저장됨)
예를 들어 이 실습을 해보면
filelist10.txt 이 파일이름으로 출력내용이 저장이 되겠죠
예 4) 기존 파일에 추가는 >> 또는 << 사용
1) ls >> files.txt
2) 기존에 있는 files.txt 파일 끝에, ls 출력 결과를 추가해줌
기존에는 아예 내용을 바꿔주는 거였는데(내용이 덮어 씌워짐) 이 표시는 그냥 추가가 되는거네요!
자 그럼 이런 기능들을 대체 왜? 언제 사용하는건가 싶죠?(저는 그래요..)
-> 주로 명령어 표준 출력을 화면이 아닌 파일에 쓸때!! 자주 쓴다고 하네요.
출력을 파일에 갖고오고(왼쪽 네모), 입력을 파일에 있는 내용에서 입력한다(오른쪽 네모)
파이프(pipe)
엇 근데 앞에서 pipe는 배웠었죠?
프로세스는 프로세스간 서로 갖고있는 데이터끼리 접근이 안된다고 배웠었잖아요? IPC기법에서요ㅎㅎ
그렇지만 지금 배울 파이프는 리다이렉션과 비슷한 개념으로 리다이렉션과 파이프 라는 개념으로 이해해주세요^ㅅ^
굳이 IPC까지 연결시키면서 이해할것까진 없으실것 같습니다!
자 그럼 파이프란 무엇인가?
두 프로세스 사이에서 한 프로세스의 출력 스트림을 또다른 프로세스의 입력 스트림으로 사용할 때 사용됨
예제를 보고 설명드릴게요
예 1) ls l grep files.txt
- ls 명령을 통한 출력 내용이 grep 명령의 입력 스트림으로 들어감
- grep files.txt는 grep 명령의 입력 스트림을 검색해서 files.txt가 들어있는 입력 내용만 출력해줌
- 따라서, ls 명령으로 해당 디렉토리/파일 중에 files.txt파일이 있는지를 출력해줌
유닉스 철학 중 하나가 프로세스를 단순하게 핵심에 집중하게 만들고 프로세스를 여러개 엮어서
하나의 사용자가 원하는 기능을 하게 하면 된다.라는게 있어요
보시면요 ls l grep issue를 함으로써,
ls라는 명령을 했고 이 아래에 있는 모든 파일리스트들이 표준 출력 스트림인거죠
그래서 터미널에 출력이 된건데!!! 이 내용을 grep이라는 명령에 표준 입력 스트림으로 돌렸고
그럼 그 데이터 입력을 받아서 grep이 하는 역할은 해당 데이터에서 issue라는 키워드가 들어가 있는 데이터를 다 찾아서
출력을 한 겁니다!
grep에 대해서 조금만 더 깊게 알아볼게요
grep: 검색 명령
- grep [-option][pattern][file or directory name]
한번 예시 코드를 쳐볼게요
grep [-option][pattern][file or directory name]
grep 사용 예 모음
1) grep python files.txt
files.txt 라는 파일에서 python이라는 문구가 들어간 모든 행을 출력
2) grep -n python files.txt
files.txt 라는 파일에서 python 이라는 문구가 들어간 모든 행을 라인까지 출력
3) grep -r python foldername
foldername 이라는 폴더 내의 모든 파일 중 python 이라는 문구가 들어간 행을 출력
4) grep -i python files.txt
files.txt 라는 파일에서 python 이라는 문구를 대,소문자 구분 없이 검색해서 출력
5) grep -E "go|java|ptyhone"files.txt
files.txt 라는 파일에서 go, java, 또는 python이 있는 모든 행을 출력
정리
1. Standard Stream
1) stdin, stdout,stderr
2. redirection
1) 주로 명령어 표준 출력을 화면이 아닌 파일에 쓸 때
3. pipe
1) 두 프로세스 사이에서 앞에 있는 프로세스의 출력 스트림을 뒤에 있는 프로세스의 입력 스트림에 사용할때
'Computer(인강) > 시스템 프로그래밍' 카테고리의 다른 글
프로세스 관리 및 제어 (0) | 2021.03.07 |
---|---|
foreground와 background (0) | 2021.03.07 |
파일 및 권한 관리 - 2 (0) | 2021.03.06 |
파일 및 권한 관리 - 1 (0) | 2021.03.06 |
다중 사용자 지원 (0) | 2021.03.05 |