입력 및 출력 리디렉션은 모든 프로그래밍 또는 스크립팅 언어의 자연스러운 기능입니다. 기술적으로 컴퓨터와 상호 작용할 때마다 본질적으로 발생합니다. stdin
에서 입력을 읽습니다. (표준 입력, 일반적으로 키보드 또는 마우스), 출력은 stdout
으로 이동합니다. (표준 출력, 텍스트 또는 데이터 스트림) 및 오류는 stderr
로 전송됩니다. . 이러한 데이터 스트림이 존재한다는 것을 이해하면 Bash 또는 Zsh와 같은 셸을 사용할 때 정보가 어디로 가는지 제어할 수 있습니다.
표준 입력, 표준 출력 및 표준 오류는 Linux에서 파일 시스템 위치로 존재합니다. /dev
에서 볼 수 있습니다. :
$ ls /dev/std*
/dev/stderr@ /dev/stdin@ /dev/stdout@
직접적으로 많은 작업을 수행할 수는 없지만 데이터를 보낼 수 있는 메타 위치로 생각하면 유용할 수 있습니다.
리디렉션의 기본은 간단합니다. >
를 몇 개 사용합니다. 출력을 리디렉션하는 문자 및 일부 <
입력을 리디렉션할 문자입니다.
출력 리디렉션
ls 명령의 출력을 파일에 쓰려면:
$ ls > list.txt
ls
의 출력이 표시되지 않습니다. 출력이 list.txt
에 기록되기 때문에 평소와 같이 화면 대신 파일. 이것은 실제로 매우 다재다능하여 한 파일의 내용을 다른 파일로 복사하는 데 사용할 수도 있습니다. 텍스트 파일일 필요도 없습니다. 바이너리 데이터에 리디렉션을 사용할 수 있습니다.
$ cat image.png > picture.png
(왜 그렇게 하고 싶은지 궁금한 경우 파일 권한에 대한 유용한 영향을 받기 위한 것입니다.)
입력 리디렉션
입력을 명령 "안으로" 리디렉션할 수도 있습니다. 많은 명령이 사용자가 제공하는 인수에서 입력을 받도록 이미 하드 코딩되어 있기 때문에 이것은 출력을 리디렉션하는 것보다 거의 유용하지 않습니다. 그러나 명령이 인수 목록을 예상하고 파일에 해당 인수가 있고 파일에서 터미널로 신속하게 "복사하여 붙여넣기"하려는 경우에 유용할 수 있습니다(실제로 복사하고 싶지 않은 경우 제외 붙여넣기):
$ sudo dnf install $(<package.list)
입력 리디렉션의 일반적인 용도는 here-document입니다. (또는 here-doc 줄여서) 및 here-string 기법. 이 입력 방법은 텍스트 블록을 표준 입력 스트림으로 리디렉션하여 특별한 파일 끝 마커까지 표시합니다(대부분의 사람들은 EOF
를 사용합니다. , 그러나 고유할 것으로 예상되는 모든 문자열이 될 수 있음). 이것을 입력해 보세요(EOF
의 두 번째 인스턴스까지). ) 터미널에:
$ echo << EOF
> foo
> bar
> baz
> EOF
예상 결과:
foo
bar
baz
여기 문서 Bash 스크립터가 여러 줄의 텍스트를 파일이나 화면에 덤프하는 데 사용하는 일반적인 트릭입니다. 파일 끝 표시로 절을 끝내는 것을 잊지 않는 한, 다루기 힘든 echo
목록을 피하는 효과적인 방법입니다. 또는 printf
진술.
here-string here-doc과 유사합니다. , 하지만 하나의 문자열(또는 따옴표가 있는 단일 문자열로 위장한 여러 문자열)로 구성됩니다.
$ cat <<< "foo bar baz"
foo bar baz
오류 메시지 리디렉션
오류 메시지는 stderr
라는 스트림으로 이동합니다. , 2>
로 지정 리디렉션을 위해. 이 명령은 오류 메시지를 output.log
라는 파일로 보냅니다. :
$ ls /nope 2> output.log
/dev/null로 데이터 보내기
표준 입력, 표준 출력 및 오류 위치가 있는 것처럼 어디에도 위치가 없습니다. Linux 파일 시스템에서. null
이라고 합니다. , /dev
에 있습니다. , 그래서 "slash dev slash null"이라고 말하기에는 너무 자주 사용하는 사람들이 종종 "devnull"로 발음합니다.
/dev/null
로 데이터를 보낼 수 있습니다. 리디렉션을 사용합니다. 예를 들어, find
명령은 장황한 경향이 있으며 파일을 검색하는 동안 권한 충돌을 보고하는 경우가 많습니다.
$ find ~ -type f
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file
find
명령은 이를 오류로 처리하므로 오류 메시지만 /dev/null
로 리디렉션할 수 있습니다. :
$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file
리디렉션 사용
리디렉션은 Bash의 한 위치에서 다른 위치로 데이터를 가져오는 효율적인 방법입니다. 항상 리디렉션을 사용하지 않을 수도 있지만 필요할 때 사용하는 방법을 배우면 일반적으로 마우스를 움직이고 키를 많이 눌러야 하는 불필요한 파일 열기 및 데이터 복사 및 붙여넣기를 많이 절약할 수 있습니다. 그러한 극단에 의지하지 마십시오. 좋은 삶을 살고 리디렉션을 사용하십시오.