...
입출력 재지정
입출력 재지정이란, 일반적인 입력, 출력을 사용하지 않고 "파일"로 입출력 하겠다는 말이다.
본래 표준입력은 기본적으로 키보드에서 직접 받아오고, 표준 출력은 기본적으로 따로 디스크에 저장하지 않고 화면에 출력된다.
이러한 입출력들을 [파일]에서 직접 입력을 받아오고 직접 출력(파일에 저장)한다.
즉, 명령을 재지정(리다이렉션)을 통해 파일로부터 입력 받고, 파일로 출력 하여, 출력과 입력의 방향을 변경할 수 있는 원리이다.
참고
표준 입력(stdin) : 표준 입력이라고 부르는 곳에서 입력 내용을 가져옴, 기본적으로 키보드에 직접 연결
표준 출력(stdout) : 명령이나 프로그램 등의 실행 결과를 표준 출력에 전송, 기본적으로 화면과 연결 되어 있고 디스크파일에 따로 저장하지 않음
표준 오류(stderr) : 명령이나 프로그램 등의 상태 및 오류 메시지를 표준 에러에 전송, 기본적으로 화면과 연결되어 있고 디스크파일에 따로 저장하지 않음
fd | 이름 | 용도 | 표준장치 |
0 | stdin | 명령어에 입력될 내용을 저장 | 키보드 |
1 | stdout | 명령어에서 출력될 내용을 저장 | 화면 |
2 | stderr | 명령어에서 출력될 에러메시지를 저장 | 화면 |
표준 출력 재지정 (Output Redirection)
- 명령의 실행 결과나 에러 상황을 화면에 출력하지 않고 파일로 저장
- > 연산자를 사용한 표준 출력 재지정 (파일명 앞에 > 연산자를 사용)
- > 연산자로 출력 방향을 지정할 때 목적 파일은 항상 처음부터 다시 작성된다. (파일 덮어씀)
- 만일 파일 내용을 초기화 안시키고 이어서 쓰고싶다면, >> 연산자로 이어쓰기 를 지정한다.
>>연산자는 기존 파일에 있는 정보에 이어서 추가적으로 내용을 기입 해준다.
$ program > file_name # program에서 출력하는 것을 file_name이라는 파일에 기록
$ program >> file_name # program에서 출력하는 것을 file_name이라는 파일에 이어서 기록
$ ls # 디렉토리 출력
systemd-private-b2dd06a5829f42f5b5f2e122f17b9afb-ModemManager.service-OOhWCc
systemd-private-b2dd06a5829f42f5b5f2e122f17b9afb-bolt.service-KuASd9
$ ls > list_stdout # 디렉토리 출력값을 list_stdout파일에 저장(출력 재지정)
$ cat list_stdout
systemd-private-b2dd06a5829f42f5b5f2e122f17b9afb-ModemManager.service-OOhWCc
systemd-private-b2dd06a5829f42f5b5f2e122f17b9afb-bolt.service-KuASd9
※ 파일이 이미 존재하는 경우 덮어쓰기 때문에, 지정한 파일과 동일한 이름을 가진 파일이 있는지 먼저 확인한 후에 사용을 하자.
>> 리다이렉션
간단하게 생각해서 append 기능이라 생각하면된다.
$ who
qa :0 2022-02-03 18:16 (:0)
$ who >> output.txt
$ who >> output.txt
$ who >> output.txt # 연속으로 파일에 내용을 넣음 (출력 재지정 이어쓰기)
$ cat output.txt
qa :0 2022-02-03 18:16 (:0)
qa :0 2022-02-03 18:16 (:0)
qa :0 2022-02-03 18:16 (:0)
이밖의 리다이렉션 연산 조합
$ 명령 >& 파일명 # : 명령이 실행된 표준 출력의 결과와 에러를 파일로 출력
$ 명령 >>& 파일명 # : 명령이 실행된 표준 출력의 결과와 에러를 파일로 덧붙여 출력
$ 명령 >! 파일명 # : 파일의 존재 유무와 상관없이 생성하고 명령이 실행된 표준 출력의 결과를 파일로 출력
$ 명령 >&! 파일명 # : 파일의 존재 유무와 상관없이 생성하고 명령이 실행된 표준 출력의 결과와 에러를 파일로 출력
$ 명령 >>! 파일명 # : 파일의 존재 유무와 상관없이 생성하고 파일에 덧붙여 출력
$ 명령 >>&! 파일명 # : 파일의 존재 유무와 상관없이 생성하고 명령이 실행된 표준 출력의 결과와 에러를 파일에 덧붙여 출력
표준 입력 재지정 (input redirection)
- 키보드 입력을 파일에서 받도록 대체 하는 것
- < 연산자를 사용해서 키보드로 연결한 표준 입력 방향을 파일로 변경
- cat 명령어를 사용하는 것과 동일한 결과를 나타냄
$ program < file_name # file_name의 파일 내용을 program의 표준 입력으로 사용하겠다 라는 의미
$ echo "우히히만세" > aaa.txt # "우히히만세" 문자를 echo를 통해 표준 출력하고, 출력된 문자를 aaa.txt 파일을 생성하고 저장 (출력 재지정)
$ ls aaa.txt # 디렉토리에 파일 생성됬는지 확인
aaa.txt
$ cat < aaa.txt # 출력 재지정 == cat aaa.txt와 같다고 보면 된다.
우히히만세
리다이렉션을 통한 Copy
리다이렉션을 통해서 파일을 복사할 수도 있다.
- echo로 file을 생성
- cat의 입력으로 file의 내용을 받는다
- 그러면 cat은 표준 출력으로 file의 내용을 출력하는데,
다시 >로 표준 출력의 내용을 file_copied라는 파일에 저장한다. - 결국은 복사를 수행한 것과 같게 되게 된다.
$ echo hello > file # hello문자열을 file에 저장
$ cat < file > file_copied # 입력재지정하여, file내용을 cat하고 그걸 바로 출력재지정하여 file_copied에 저장
$ cat file_copied # 결국 복사를 한것 과 같아진다.
hello
표준 오류 재지정
명령어 실행에서 에러가 발생했을때, 원래동작은 그냥 화면에 출력하고 끝이지만,
명령어를 통해 출력되는 에러 내용을 파일등으로 저장 및 출력하도록 재지정하는 것이다.
앞서 위에서, 배운 stderr 번호를 화살표와 같이 쓰면 표준 오류 재지정이 된다.
- $ ls -l nullfile 2> err.txt
$ ls -l nullfile 2> err.txt
# ls -l nullfile은 실패하는 명령어이다. nullfile이 디렉토리에 없을경우 실패하게 된다.
# 그러한 실패err를 (2)표준오류 지정을 통해 err.txt파일에 저장한다
# 표준 입력 : 0
# 표준 출력 : 1
# 표준 오류 : 2
즉, 오류 출력은 명령 동작이 실패하게 되어 오류 메세지를 내보내게 되면,
이 동작을 다른 파일로 돌려버리게 하면, 오류를 제외한 검색 결과만을 볼 수 있게 되는 원리이다.
파이프
파이프라는 것은 program1의 표준 출력을 program2의 표준입력으로 입력받는 것이다.
즉, 명령어의 결과를 다시 어떤 명령어의 입력으로 받아야 할때 사용된다.
리눅스에서 매우 흔히 쓰이므로 익혀두면 매우 유용하다.
요약 : 앞 명령어의 결과를 뒤에 나오는 명령어의 입력으로 처리하기 위해 사용하는 방법
- 둘 이상의 명령을 함께 묶어 출력의 결과를 다른 프로그램의 입력으로 전환 하는 기능
- 즉, 명령어의 표준 출력을 또 다른 명령어의 표준 입력과 연결
- 명령어와 명령어의 연결은 | 기호를 사용
- | 기호 앞의 명령 결과가 뒤의 명령에 입력 데이터로 사용
$ program1 | program2 # program1의 표준 출력을 program2의 표준입력으로 입력 받기
# ls -l 명령을 보면 무수히 많은 파일들이 보이는데 그 중에서 zip이라는 문자열을 포함한 것만 확인하는 연속 명령
$ ls -l | grep zip
lrwxrwxrwx. 1 root root 5 5월 10 2019 bunzip2 -> bzip2
lrwxrwxrwx. 1 root root 5 5월 10 2019 bzcat -> bzip2
-rwxr-xr-x. 1 root root 38472 5월 10 2019 bzip2
-rwxr-xr-x. 1 root root 17560 5월 10 2019 bzip2recover
-rwxr-xr-x. 1 root root 40256 5월 10 2019 funzip
-rwxr-xr-x. 1 root root 3447 5월 10 2019 gpg-zip
-rwxr-xr-x. 1 root root 2345 11월 8 2019 gunzip
-rwxr-xr-x. 1 root root 170544 11월 8 2019 gzip
lrwxrwxrwx. 1 root root 6 5월 11 2019 mzip -> mtools
-rwxr-xr-x. 1 root root 5656 5월 13 2019 preunzip
-rwxr-xr-x. 1 root root 5656 5월 13 2019 prezip
-rwxr-xr-x. 1 root root 13352 5월 13 2019 prezip-bin
-rwxr-xr-x. 2 root root 210408 5월 10 2019 unzip
-rwxr-xr-x. 1 root root 105064 5월 10 2019 unzipsfx
-rwxr-xr-x. 1 root root 234496 5월 11 2019 zip
-rwxr-xr-x. 1 root root 105376 5월 11 2019 zipcloak
-rwxr-xr-x. 1 root root 2953 10월 10 2008 zipgrep
-rwxr-xr-x. 2 root root 210408 5월 10 2019 zipinfo
-rwxr-xr-x. 1 root root 100104 5월 11 2019 zipnote
-rwxr-xr-x. 1 root root 100112 5월 11 2019 zipsplit
cat /etc/passwd | grep "root" # == grep "root" /etc/passwd
# /etc/passwd의 내용이 grep의 입력값으로 받아 root를 필터링
# 디렉토리 개수 확인하기
$ ll | grep "^d" | wc -l
# * ll = ls -l : List 형태로 출력
# * grep "^d" : d로 시작하는 행 필터링 (행의 앞글자 d는 directory를 의미)
# * wc -l은 행의 개수를 출력
# -> ll로 디렉토리 파일들을 출력하고, 그 출력 내용을 d로 시작되는 파일만 필터링하고, 필터링 된 내용의 개수를 출력
# 참고자료
https://reakwon.tistory.com/115
https://neul-carpediem.tistory.com/70
https://lazycoding.tistory.com/94
인용한 부분에 있어 만일 누락된 출처가 있다면 반드시 알려주시면 감사하겠습니다
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.