쉘 입력/출력 리디렉션


대부분의 UNIX 시스템 명령은 터미널의 입력을 받아들이고 결과 출력을 다시 터미널로 보냅니다. 명령은 일반적으로 표준 입력(기본적으로 터미널)이라는 위치에서 입력을 읽습니다. 마찬가지로, 명령은 일반적으로 기본적으로 터미널이기도 한 표준 출력에 출력을 씁니다.

리디렉션 명령어 목록은 다음과 같습니다.

명령 설명
명령 > 파일 출력을 파일로 리디렉션합니다.
명령 <파일 입력을 파일로 리디렉션합니다.
명령>>파일 파일을 추가하여 출력을 파일로 리디렉션합니다.
n > 파일 파일 설명자 n이 있는 파일을 파일로 리디렉션합니다.
n >>파일 파일 설명자 n이 있는 파일을 추가하여 file로 리디렉션합니다.
n>&m 출력 파일 m과 n을 병합합니다.
n<&m 입력 파일 m과 n을 병합합니다.
<<태그 여는 태그와 닫는 태그 사이의 내용을 입력으로 사용합니다.

파일 설명자 0은 일반적으로 표준 입력(STDIN), 1은 표준 출력(STDOUT), 2는 표준 오류 출력(STDERR)이라는 점에 유의해야 합니다.


출력 리디렉션

리디렉션은 일반적으로 명령 사이에 특정 기호를 삽입하여 수행됩니다. 특히 이러한 기호의 구문은 다음과 같습니다.

command1 > file1

위 명령은 command1을 실행한 다음 출력 내용을 file1에 저장합니다.

file1의 기존 콘텐츠는 새 콘텐츠로 대체됩니다. 파일 끝에 새 내용을 추가하려면 >> 연산자를 사용하세요.

Example

다음 who 명령을 실행하면 명령의 전체 출력이 사용자 파일(users)로 리디렉션됩니다.

$ who > users

실행 후 터미널에 정보 출력이 없기 때문입니다. 변경됨 표준 출력 장치(터미널)를 지정된 파일로 리디렉션합니다.

cat 명령을 사용하여 파일 내용을 볼 수 있습니다.

$ cat users
_mbsetupuser console  Oct 31 17:35 
tianqixin    console  Oct 31 17:35 
tianqixin    ttys000  Dec  1 11:33

출력 리디렉션이 파일 내용을 덮어쓰게 됩니다. 아래 예를 참조하세요.

$ echo "php中文网:www.php.cn" > users
$ cat users
php中文网:www.php.cn
$

파일 내용을 덮어쓰지 않으려면 >를 사용할 수 있습니다. ;> 파일 끝에 추가합니다. 예:

$ echo "php中文网:www.php.cn" >> users
$ cat users
php中文网:www.php.cn
php中文网:www.php.cn
$

입력 리디렉션

출력 리디렉션과 마찬가지로 Unix 명령도 파일에서 입력을 가져올 수 있습니다. 구문은 다음과 같습니다. 키보드에서 입력을 받아야 내용을 읽을 수 있는 파일로 전송됩니다.

참고: 출력 리디렉션은 기호(>)보다 크고 입력 리디렉션은 기호(<)보다 작습니다.

예제

위의 예에 따라 사용자 파일의 줄 수를 계산하고 다음 명령을 실행해야 합니다.

command1 < file1

입력을 사용자 파일로 리디렉션할 수도 있습니다.

$ wc -l users
       2 users

참고: 결과는 다음과 같습니다. 위의 두 가지 예는 다릅니다. 첫 번째 예는 파일 이름을 출력하지만 두 번째 예는 표준 입력에서만 읽을 수 있기 때문에 출력하지 않습니다.

$  wc -l < users
       2

입력과 출력을 동시에 바꾸고, command1을 실행하고, infile 파일에서 내용을 읽은 다음, 출력을 outfile에 씁니다.

리디렉션에 대한 자세한 설명

일반적으로 각 Unix/Linux 명령이 실행될 때 세 개의 파일이 열립니다:

    표준 입력 파일(stdin): stdin의 파일 설명자는 0이며 Unix 프로그램은 기본적으로 stdin에서 데이터를 읽습니다.
  • 표준 출력 파일(stdout): stdout의 파일 설명자는 1입니다. Unix 프로그램은 기본적으로 stdout으로 데이터를 출력합니다.
  • 표준 오류 파일(stderr): stderr의 파일 설명자는 2이며 Unix 프로그램은 stderr 스트림에 오류 정보를 씁니다.
  • 기본적으로 > file 명령은 stdout을 파일로 리디렉션하고, < file 명령은 stdin을 파일로 리디렉션합니다.

stderr을 파일로 리디렉션하려면 다음과 같이 작성하면 됩니다.

command1 < infile > outfile

stderr을 파일 끝에 추가하려면 다음과 같이 작성하면 됩니다.

$ command 2 > file

2

는 표준 오류를 나타냅니다. 파일(stderr). stdout과 stderr을 병합하여 파일로 리디렉션하려면 다음과 같이 작성하면 됩니다.

$ command 2 >> file

stdin과 stdout을 모두 리디렉션하려면 다음과 같이 작성하면 됩니다.

$ command > file 2>&1

或者

$ command >> file 2>&1

command 명령은 stdin을 file1로 리디렉션합니다. 및 stdout file2로 리디렉션합니다.


Here Document

Here Document는 입력을 대화형 Shell 스크립트 또는 프로그램으로 리디렉션하는 데 사용되는 Shell의 특수 리디렉션 방법입니다.

기본 형식은 다음과 같습니다.

$ command < file1 >file2

이 기능은 명령에 대한 입력으로 두 구분 기호 사이의 내용(문서)을 전달하는 것입니다.

주의:

  • 끝의 구분 기호는 상단 형식으로 작성해야 하며 앞에는 공백, 탭 들여쓰기를 포함하여 뒤에 문자가 있어서는 안 됩니다.

  • 초기 구분 기호 앞뒤의 공백은 무시됩니다.

명령줄에서 wc -l 명령을 통해 Here Document의 줄 수를 계산하세요.

command << delimiter
    document
delimiter

또한 스크립트에서 Here Document를 사용할 수도 있습니다. 예를 들면:

$ wc -l << EOF
    欢迎来到
    php中文网
    www.php.cn
EOF
3          # 输出结果为 3 行
$

위 스크립트와 출력을 실행합니다. 결과:

#!/bin/bash
# author:php中文网
# url:www.php.cn

cat << EOF
欢迎来到
php中文网
www.php.cn
EOF

/dev/null 파일

명령을 실행하고 싶지만 출력이 화면에 표시되지 않도록 하려면 출력을 /dev/null로 리디렉션할 수 있습니다.

欢迎来到
php中文网
www.php.cn

/ dev/null은 기록된 모든 내용이 삭제되는 특수 파일입니다. 파일에서 읽으려고 하면 아무것도 읽히지 않습니다. 그러나 /dev/null 파일은 명령의 출력을 해당 파일로 리디렉션하면 "출력 비활성화" 효과가 있습니다.

stdout 및 stderr을 차단하려면 다음과 같이 작성할 수 있습니다.

$ command > /dev/null

참고: 0은 표준 입력(STDIN), 1은 표준 출력(STDOUT), 2는 표준 오류 출력입니다. (STDERR).