Unix / Linux-셸 입력 / 출력 리디렉션

이 장에서는 셸 입력 / 출력 리디렉션에 대해 자세히 설명합니다. 대부분의 Unix 시스템 명령은 터미널에서 입력을 받아 결과 출력을 터미널로 다시 보냅니다. 명령은 일반적으로 기본적으로 터미널 인 표준 입력에서 입력을 읽습니다. 마찬가지로 명령은 일반적으로 출력을 표준 출력 (기본적으로 터미널)에 기록합니다.

출력 리디렉션

일반적으로 표준 출력용으로 의도 된 명령의 출력은 대신 파일로 쉽게 전환 될 수 있습니다. 이 기능을 출력 리디렉션이라고합니다.

일반적으로 출력을 표준 출력에 쓰는 명령에 표기법> 파일이 추가되면 해당 명령의 출력이 터미널 대신 파일에 기록됩니다.

다음을 확인하십시오. who 사용자 파일에서 명령의 전체 출력을 리디렉션하는 명령입니다.

$ who > users

터미널에 출력이 표시되지 않습니다. 이는 출력이 기본 표준 출력 장치 (터미널)에서 지정된 파일로 리디렉션 되었기 때문입니다. 전체 내용에 대한 사용자 파일을 확인할 수 있습니다-

$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

명령의 출력이 파일로 리디렉션되고 파일에 이미 일부 데이터가 포함되어 있으면 해당 데이터가 손실됩니다. 다음 예를 고려하십시오-

$ echo line 1 > users
$ cat users
line 1
$

>> 연산자를 사용하여 다음과 같이 기존 파일에 출력을 추가 할 수 있습니다.

$ echo line 2 >> users
$ cat users
line 1
line 2
$

입력 리디렉션

명령의 출력을 파일로 리디렉션 할 수있는 것처럼 명령 입력을 파일에서 리디렉션 할 수 있습니다. 로greater-than character > 출력 리디렉션에 사용됩니다. less-than character < 명령 입력을 리디렉션하는 데 사용됩니다.

일반적으로 표준 입력에서 입력을받는 명령은 이러한 방식으로 파일에서 입력을 리디렉션 할 수 있습니다. 예를 들어, 위에서 생성 한 파일 사용자 의 줄 수를 계산하려면 다음과 같이 명령을 실행할 수 있습니다.

$ wc -l users
2 users
$

실행하면 다음 출력이 표시됩니다. 표준 입력을 리디렉션하여 파일의 줄 수를 계산할 수 있습니다.wc파일 사용자의 명령 -

$ wc -l < users
2
$

wc 명령의 두 가지 형식에 의해 생성되는 출력에는 차이가 있습니다. 첫 번째 경우 파일 사용자의 이름이 줄 수와 함께 나열됩니다. 두 번째 경우에는 그렇지 않습니다.

첫 번째 경우 wc는 파일 사용자로부터 입력을 읽고 있음을 알고 있습니다. 두 번째 경우에는 표준 입력에서 입력을 읽는 것만 알고 있으므로 파일 이름을 표시하지 않습니다.

여기 문서

here document 입력을 대화 형 쉘 스크립트 또는 프로그램으로 리디렉션하는 데 사용됩니다.

대화 형 프로그램 또는 대화 형 셸 스크립트에 필요한 입력을 제공하여 사용자 작업없이 셸 스크립트 내에서 대화 형 프로그램을 실행할 수 있습니다.

a에 대한 일반적인 형태 here 문서는-

command << delimiter
document
delimiter

여기서 쉘은 <<연산자는 지정된 구분 기호를 포함하는 행을 찾을 때까지 입력을 읽는 명령으로 사용됩니다. 그런 다음 구분 기호를 포함하는 행까지의 모든 입력 행이 명령의 표준 입력으로 공급됩니다.

구분 기호는 쉘에 here문서가 완료되었습니다. 그것이 없으면 쉘은 계속해서 입력을 영원히 읽습니다. 구분 기호는 공백이나 탭을 포함하지 않는 단일 단어 여야합니다.

다음은 명령에 대한 입력입니다. wc -l 총 줄 수를 계산하려면-

$wc -l << EOF
   This is a simple lookup program 
	for good (and bad) restaurants
	in Cape Town.
EOF
3
$

당신은 사용할 수 있습니다 here document 다음과 같이 스크립트를 사용하여 여러 줄을 인쇄하려면-

#!/bin/sh

cat << EOF
This is a simple lookup program 
for good (and bad) restaurants
in Cape Town.
EOF

실행하면 다음과 같은 결과를 받게됩니다.

This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

다음 스크립트는 vi 텍스트 편집기 및 파일에 입력 저장 test.txt.

#!/bin/sh

filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

vim 역할을하는 vim으로이 스크립트를 실행하면 다음과 같은 출력을 볼 수 있습니다.

$ sh test.sh
Vim: Warning: Input is not from a terminal
$

스크립트를 실행하면 파일에 다음이 추가 된 것을 볼 수 있습니다. test.txt

$ cat test.txt
This file was created automatically from
a shell script
$

출력 버리기

때때로 명령을 실행해야하지만 화면에 출력이 표시되는 것을 원하지 않습니다. 이러한 경우 출력을 파일로 리디렉션하여 삭제할 수 있습니다./dev/null

$ command > /dev/null

여기서 command는 실행하려는 명령의 이름입니다. 파일/dev/null 모든 입력을 자동으로 삭제하는 특수 파일입니다.

명령의 출력과 오류 출력을 모두 버리려면 표준 리디렉션을 사용하여 STDERR ...에 STDOUT

$ command > /dev/null 2>&1

여기 2 대표하다 STDERR1 대표하다 STDOUT. 다음과 같이 STDOUT을 STDERR로 리디렉션하여 STDERR에 메시지를 표시 할 수 있습니다.

$ echo message 1>&2

리디렉션 명령

다음은 리디렉션에 사용할 수있는 명령의 전체 목록입니다.

Sr. 아니. 명령 및 설명
1

pgm > file

pgm의 출력이 파일로 리디렉션됩니다.

2

pgm < file

프로그램 pgm은 파일에서 입력을 읽습니다.

pgm >> file

pgm의 출력이 파일에 추가됩니다.

4

n > file

설명자가있는 스트림의 출력 n 파일로 리디렉션 됨

5

n >> file

설명자가있는 스트림의 출력 n 파일에 추가

6

n >& m

스트림의 출력 병합 n 스트림 m

7

n <& m

스트림의 입력 병합 n 스트림 m

8

<< tag

표준 입력은 여기에서 줄 시작 부분의 다음 태그를 통해옵니다.

9

|

한 프로그램 또는 프로세스에서 출력을 가져 와서 다른 프로그램으로 보냅니다.

파일 설명자는 0 일반적으로 표준 입력 (STDIN)입니다. 1 표준 출력 (STDOUT)이고 2 표준 오류 출력 (STDERR)입니다.