우분투는 파일로 출력합니다. 스트림, 프로그램 채널 및 리디렉션. 터미널 출력을 파일에 저장하는 기본 방법

명시된 바와 같이 프로그램은 일반적으로 I/O용 표준 스트림을 처리하지만 쉘에는 I/O 리디렉션을 위한 특수 기능이 있습니다.

5.5.1 연산자 >,< и >>

" 기호는 리디렉션을 나타내는 데 사용됩니다. > ", "< " 그리고 " >> ". 가장 일반적인 용도는 명령 출력을 파일로 리디렉션하는 것입니다. 예는 다음과 같습니다.

$ ls -l > /home/jim/dir.txt

이 명령은 명령이 실행될 당시 현재 디렉토리의 파일 및 하위 디렉토리 목록을 /home/jim/dir.txt 파일에 저장합니다. ㅋㅋㅋ; 또한, 지정된 파일이 존재하지 않으면 생성됩니다. 존재하는 경우 덮어쓰게 됩니다. 명령 출력을 기존 파일 끝에 추가하려면 필요한 기호 대신 > 사용 >> . 이 경우 문자 앞이나 뒤에 공백이 있으면 > 또는 >> 중요하지 않으며 사용자의 편의를 위해서만 제공됩니다.

출력을 파일뿐만 아니라 다른 명령의 입력이나 장치(예: 프린터)로 보낼 수도 있습니다. 따라서 /home/jim/report.txt 파일의 단어 수를 계산하려면 다음 명령을 사용할 수 있습니다.

$ 고양이 /home/jim/report.txt > wc -w

파일을 인쇄하려면 다음 명령을 사용하십시오.

$ 고양이 /home/jim/report.txt > lpr

보시다시피 운영자님 > 출력 스트림을 리디렉션하는 역할을 합니다. 입력 스트림과 관련하여 유사한 기능이 연산자에 의해 수행됩니다. < . 특정 파일의 단어 수를 계산하는 위의 예제 명령은 다음과 같이 다시 작성할 수 있습니다(명령이 없음에 유의) 고양이):

$wc -w< /home/jim/report.txt

이 리디렉션 옵션은 일반적으로 키보드 입력을 허용(또는 예상)하는 명령에 대한 다양한 스크립트에서 자주 사용됩니다. 일부를 자동화하는 스크립트에서 일상적인 작업, 이 명령을 실행하기 위해 입력해야 하는 내용이 미리 기록되어 있는 파일에서 필요한 정보를 명령에 제공할 수 있습니다.

상징이라는 사실 때문에 < , > 그리고 >> 표준 스트림에서 작동하는 경우 일반적으로 수행되는 일반적인 방식뿐만 아니라 약간 다른 방식으로도 사용할 수 있습니다. 따라서 다음 명령은 동일합니다.

$ 고양이 > 파일

$cat>파일

$ >파일 고양이

$ > 파일 고양이

그러나 표준 스트림이 정의된 명령 없이는 리디렉션 기호 자체를 사용할 수 없으므로 다음과 같이 입력할 수 없습니다.

$파일1 > 파일2

파일 사본을 얻으십시오. 그러나 표준 스레드가 모든 명령에 대해 정의되기 때문에 이것이 이 메커니즘의 중요성을 감소시키지는 않습니다. 이 경우 표준 입력 및 출력뿐만 아니라 다른 스트림도 리디렉션할 수 있습니다. 이렇게 하려면 리디렉션 기호 앞에 리디렉션된 스트림의 수를 지정하십시오. 표준 입력 stdin은 숫자 0, 표준 출력 stdout은 숫자 1, 표준 오류 메시지 stderr은 숫자 2입니다. 즉, 리디렉션 명령의 전체 형식은 다음과 같습니다(> 근처의 공백은 선택 사항임을 기억하세요).

명령 N>M

어디 N그리고 — 표준 스트림 수(0,1,2) 또는 파일 이름. 경우에 따라 기호 사용 < , > 그리고 >> 채널 번호나 파일 이름을 지정하지 않고는 기본적으로 누락된 번호, 즉 표준 출력을 1로 대체하기 때문에 가능합니다. 응, 교환원 > 숫자를 지정하지 않으면 다음과 같이 해석됩니다. 1 > .

단순히 표준 스트림을 리디렉션하는 것 외에도 스트림을 한 채널 또는 다른 채널로 리디렉션하는 것뿐만 아니라 표준 스트림의 내용을 복사하는 것도 가능합니다. 이에 대한 특별한 기호가 있습니다. & 는 스트림이 리디렉션되는 채널 번호 앞에 배치됩니다.

명령 N > &M

이 명령은 채널 번호의 출력을 의미합니다. N표준 출력으로 전송되고 채널 번호로 복제됩니다. . 예를 들어, 오류 메시지를 표준 출력에 복제하려면 다음 명령을 제공해야 합니다. 2>&1, ~하는 동안 1>&2 stdout을 stderr로 복제합니다. 이 기능은 출력을 파일로 리디렉션할 때 특히 유용합니다. 그 이유는 화면에 메시지가 표시되고 파일에 저장되기 때문입니다.

5.5.2 연산자 |

출력 리디렉션을 위한 특수 옵션은 소프트웨어 채널(파이프 또는 컨베이어라고도 함)입니다. 이를 위해 이전 명령의 출력이 다음 명령의 입력 역할을 하는 두 개 이상의 명령을 수직 막대 문자("|")로 연결하거나 원하는 경우 구분합니다. 이 경우 기호 왼쪽에 있는 명령의 표준 출력 스트림은 | , 기호 오른쪽에 있는 프로그램의 표준 입력으로 전송됩니다. | . 예를 들어:

$ 고양이 마이파일 | 그렙 리눅스 | 화장실 -l

이 줄은 명령의 출력이 다음과 같음을 의미합니다. 고양이, 즉 myfile 파일의 텍스트가 명령 입력으로 전송됩니다. grep, "Linux"라는 단어가 포함된 줄만 강조 표시됩니다. 명령 출력 grep그러면 명령 입력으로 연결됩니다. 화장실 -l, 해당 줄의 수를 계산합니다.

프로그램 파이프는 각각 입력 스트림에서 특정 변환만 수행하는 여러 개의 작은 프로그램을 결합하여 좀 더 복잡한 변환을 초래하는 일반화된 명령어를 만드는 데 사용됩니다.

셸은 파이프라인에 포함된 모든 명령을 동시에 실행하도록 호출하고 각 명령에 대해 별도의 셸 인스턴스를 시작하므로 첫 번째 프로그램이 출력 스트림에서 무언가를 생성하기 시작하자마자 다음 명령이 처리를 시작합니다. 동일한 방식으로 각 후속 명령은 자체 작업을 수행하여 이전 명령의 데이터를 기다리고 그 결과를 다음 명령의 입력으로 생성합니다. 다음 명령이 시작되기 전에 명령을 완전히 완료하려면 해당 명령을 한 줄에 파이프라인 기호로 사용할 수 있습니다. | 및 세미콜론 ; . 각 세미콜론 앞에는 셸이 중지되고 파이프라인에 포함된 모든 이전 명령이 실행이 완료될 때까지 기다립니다.

채널의 종료 상태(프로그램 종료 후 반환된 부울 값)는 반환된 종료 상태와 동일합니다. 마지막 명령컨베이어 파이프라인의 첫 번째 명령 앞에 "!" 기호를 넣으면 파이프라인의 종료 상태가 마지막 명령의 종료 상태에 대한 논리적 부정이 됩니다. 셸은 반환 값을 설정하기 전에 모든 파이프라인 명령이 완료될 때까지 기다립니다.

5.5.3 필터

위의 마지막 예(명령어 사용) grep)은 또 다른 중요한 개념, 즉 필터 프로그램을 설명하는 데 사용될 수 있습니다. 필터는 입력 데이터 스트림을 가져와 일부 변환을 수행하고 결과를 표준 출력(사용자 재량에 따라 다른 곳으로 리디렉션할 수 있는 곳)으로 출력하는 명령(또는 프로그램)입니다. 필터 명령에는 위에서 이미 언급한 명령이 포함됩니다. 고양이, 더, 더 적게, 화장실, cmp, diff, 다음 명령도 마찬가지입니다.

표 5.1.필터 명령

간단한 설명

grep, fgrep, egrep

찾고있는 입력 파일또는 표준의 데이터 입력 라인, 지정된 패턴을 포함하고 이를 표준 출력으로 출력합니다.

주어진 목록에 나열된 입력 스트림에서 발생하는 모든 문자를 두 번째 지정된 목록의 해당 문자로 바꿉니다.

통신

두 파일을 한 줄씩 비교하고 3개의 열을 표준 출력으로 출력합니다. 하나는 1개의 파일에만 나타나는 줄, 두 번째는 두 번째 파일에만 나타나는 줄, 세 번째는 두 파일에 모두 나타나는 줄입니다.

인쇄 형식 텍스트 파일또는 표준 입력의 내용

sed

입력 데이터 스트림(파일 또는 표준 입력에서 가져옴)에서 일부 변환을 수행하는 데 사용되는 문자열 편집기

특수 필터는 명령입니다 , 입력 스트림을 "분할"하여 한쪽에서는 표준 출력으로, 다른 쪽에서는 파일(이름을 지정해야 함)로 보냅니다. 그 동작으로 명령이 실행된다는 것을 쉽게 알 수 있습니다. 리디렉션 연산자와 유사 1>파일(&F).

다음을 사용하여 필터의 기능을 크게 확장할 수 있습니다. 정규 표현식, 예를 들어 다양하고 매우 복잡한 템플릿을 사용하여 검색을 구성할 수 있습니다.

리디렉션과 필터에 관해 많은 말이 있을 수 있습니다. 그러나 이 자료는 Petersen [P1.4] 및 Kelly-Bootle [P1.8]과 ​​같이 UNIX 및 Linux에 관한 대부분의 책에서 사용할 수 있습니다. 따라서 우리는 말한 내용으로 제한하고 소위 환경 또는 쉘이 생성하는 환경을 고려하는 것으로 넘어갈 것입니다.

V. Kostromin(rus-linux 닷넷의 kos) - 5.5. I/O 리디렉션, 채널 및 필터

좋은 시간 되세요, 독자 여러분!
이 기사에서는 기본 원칙에 따라 지식을 체계화하고 싶습니다. 프로그램 스트림 및 채널 운영통역사와 일반적으로 Linux OS 및 가능성에 대해 리디렉션데이터 스트림.
맨 처음에는 인터프리터가 세 가지 표준 스트림으로 작동한다는 점에 주목하고 싶습니다.

  1. 표준 출력 이것 표준 출력, 명령의 출력을 제공합니다. 스트림 설명자는 1입니다.
  2. 표준 오류 이것 표준 오류 스트림, 명령 오류를 인쇄합니다. 설명자는 2입니다.
  3. 표준 입력 이것 표준 입력, 명령에 대한 입력을 제공합니다. 설명자는 0입니다.

지금 간단한 말로이 세 가지 사항이 무엇을 의미하는지 설명하겠습니다.

표준 출력- 표준 출력 스트림. 이 말은 간단한 언어로, 명령을 실행할 때 인터프리터에 표시되는 정보입니다. 즉, 인터프리터에서 실행된 명령이 터미널(읽기: 화면)에 보고하고 표시하는 모든 메시지(오류 메시지 없음)입니다. (화면 출력은 기본적으로 설정되어 있지만 파일로 출력하거나 다른 명령으로 리디렉션하는 등의 출력을 지정할 수도 있습니다. 이 작업이 수행되는 방법은 아래에서 설명하겠습니다.)

표준 오류- 오류의 흐름. 이는 bash에서 명령을 실행할 때 발생하는 오류로, 기본적으로 stdout, 즉 터미널로 출력됩니다(다시 말하지만, 다른 위치로의 출력이 지정되지 않은 경우).

표준 입력- 입력 스트림. 간단히 말해서 이것은 명령을 실행하기 위해 키보드에서 인터프리터로 입력하는 것입니다.

이러한 흐름은 http://rus-linux.net/에서 가져온 그림에 매우 잘 설명되어 있습니다.

~에 이 사진: 녹색으로 표시된 Stdin에는 핸들 0이 있습니다.
빨간색으로 표시된 Stdout에는 핸들 1이 있습니다.
파란색으로 표시된 Stderr에는 핸들 2가 있습니다.

다음으로 이러한 스트림을 파일로/에서 리디렉션하는 방법을 설명하겠습니다. 즉, 명령을 실행할 때 메시지나 오류가 화면에 표시되지 않고 파일에 기록되도록 합니다. 그것은 무엇을 위한 것입니까? 예를 들어, 출력이 터미널 창에 맞지 ​​않는 일부 명령을 실행하고 있습니다. 표준 출력을 한 파일에 저장하고 표준 오류를 다른 파일에 저장하도록 지시합니다. 따라서 모든 오류와 표준 출력이 필요한 경우 저장된 파일을 열어 자세히 볼 수 있습니다.

따라서 스레드 리디렉션은 다음과 같이 수행됩니다.

$ 명령 n>파일

이 줄은 다음을 보여줍니다: 명령 실행 명령및 흐름 리디렉션(여기서 N= 스트림 핸들)을 파일로 파일.이 리디렉션을 수행할 때 대상 파일이 존재하면 덮어썼다. 이 경우 n을 지정하지 않으면 표준 출력이 가정됩니다.

$ 명령 n>>파일

이 명령은 구문이 비슷하지만 여기서는 ">>" 기호가 지정됩니다. 이 리디렉션을 사용하면 대상 파일이 존재하는 경우 명령 출력이 기존 데이터에 추가됩니다.

$명령< file

V 이 예에서는명령실행되어 파일을 입력 소스로 사용합니다. 파일,키보드 입력 대신

오류와 일반 프로그램 출력이 함께 처리될 수 있도록 표준 오류 스트림을 표준 출력 스트림과 결합해야 하는 경우도 있습니다. 이러한 목적을 위해 & 기호와의 조합이 사용됩니다. 이 작업의 예:

/ -name .name_file > /path/to/file 2>&1 찾기

이 명령을 실행하면 루트에서 파일을 검색합니다. 파일 시스템이름 포함 .name_file검색 결과(stdout 및 stderr)를 파일로 리디렉션 /경로/대상/파일. 설계 > /경로/대상/파일 2>&1표준 출력을 다음으로 리디렉션합니다. /경로/대상/파일오류를 표준 출력으로 인쇄합니다. 즉, > 앞에 2>&1을 쓰면 통역사가 2>&1을 읽을 때 표준 출력 스트림이 리디렉션되는 위치를 아직 알지 못하기 때문에 작동하지 않으므로 오류와 출력 스트림이 병합되지 않습니다.

$ 명령 > 파일 2>&1

글쓰기와 유사:

$ 명령 &> 파일

$ 명령 2>&파일

출력을 무시해야 하는 경우 출력은 /dev/null 장치로 지정될 수 있습니다. 이는 임의의 양의 정보를 가져와 아무것도 아닌 것으로 바꾸는 일종의 "블랙홀"입니다.

흐름 방향 전환에 대해 제공되는 정보는 본질을 이해하기에 충분할 것이라고 생각합니다. 이제 컨베이어 이송.

Linux의 파이프라인 중간 임시 파일을 사용하지 않고 한 프로그램의 출력이 다른 프로그램의 입력으로 직접 전송될 때 여러 프로그램이 함께 작동하는 기능입니다. 파이프라인을 사용하기 위한 구문은 다음과 같습니다.

$명령1 | 명령 2

이 예에서는 명령이 실행됩니다. 명령1, 출력 스트림은 실행 시 입력 스트림으로 사용됩니다. 명령 2.

오늘은 그게 다야. 나는 의견과 추가 사항을 기쁘게 받아들일 것입니다. 감사합니다.

감사합니다, McSim!

명령줄 스크립트의 출력 작업을 위한 두 가지 방법에 이미 익숙합니다.

  • 화면에 출력 데이터를 표시합니다.
  • 출력을 파일로 리디렉션합니다.
때로는 화면에 무언가를 보여주고 파일에 무언가를 써야 하기 때문에 Linux가 입력과 출력을 처리하는 방법을 이해해야 합니다. 이는 스크립트 결과를 필요한 곳에 보내는 방법을 배우는 것을 의미합니다. 표준 파일 설명자에 대해 이야기하는 것부터 시작해 보겠습니다.

표준 파일 설명자

Linux의 모든 것은 입력과 출력을 포함한 파일입니다. 운영 체제설명자를 사용하여 파일을 식별합니다.

각 프로세스는 최대 9개의 열린 파일 핸들을 가질 수 있습니다. 배쉬 쉘 ID가 0, 1, 2인 처음 세 개의 핸들을 예약합니다. 그 의미는 다음과 같습니다.

  • 0 , STDIN - 표준 입력 스트림.
  • 1, STDOUT - 표준 출력 스트림.
  • 2, STDERR - 표준 오류 스트림.
이 세 가지 특수 핸들은 스크립트에 대한 입력 및 출력을 처리합니다.
표준 스트림을 실제로 이해해야 합니다. 이는 스크립트와 스크립트의 상호 작용의 기초와 비교할 수 있습니다. 외부 세계. 그들에 대한 세부 사항을 살펴 보겠습니다.

STDIN

STDIN은 쉘의 표준 입력 스트림입니다. 터미널의 경우 표준 입력은 키보드입니다. 스크립트가 입력 리디렉션 문자를 사용하는 경우 -< , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

많은 배시 명령다음과 같은 경우 STDIN의 입력을 수락합니다. 명령줄데이터를 가져와야 하는 파일이 지정되지 않았습니다. 예를 들어 cat 명령의 경우에도 마찬가지입니다.

매개변수를 지정하지 않고 명령줄에 cat 명령을 입력하면 STDIN의 입력이 허용됩니다. 다음 줄을 입력하면 cat은 이를 화면에 표시합니다.

표준 출력

STDOUT은 쉘의 표준 출력 스트림입니다. 기본적으로 이 화면입니다. 대부분의 bash 명령은 데이터를 STDOUT으로 출력하므로 해당 데이터가 콘솔에 표시됩니다. >> 명령을 사용하여 데이터를 내용에 추가하여 데이터를 파일로 리디렉션할 수 있습니다.

따라서 다음 명령을 사용하여 더 많은 데이터를 추가할 수 있는 데이터 파일이 있습니다.

비밀번호 >> 마이파일
어떤 pwd 출력이 myfile 파일에 추가되지만 이미 그 안에 있는 데이터는 아무데도 가지 않습니다.

명령 출력을 파일로 리디렉션

지금까지는 괜찮았지만 존재하지 않는 xfile에 액세스하여 다음과 같은 작업을 수행하려고 하면 오류 메시지가 myfile로 전송되도록 설계되었습니다.

Ls -l xfile > myfile
이 명령을 실행하면 화면에 오류 메시지가 표시됩니다.


존재하지 않는 파일에 액세스하려고 합니다.

존재하지 않는 파일에 액세스하려고 하면 오류가 생성되지만 쉘은 오류 메시지를 화면에 인쇄하여 해당 파일로 리디렉션하지 않습니다. 하지만 우리는 오류 메시지가 파일에 포함되기를 원했습니다. 무엇을 해야 할까요? 대답은 간단합니다. 세 번째 표준 설명자를 사용하세요.

STDERR

STDERR은 쉘의 표준 오류 스트림입니다. 기본적으로 이 핸들은 STDOUT이 가리키는 것과 동일한 것을 가리키므로 오류가 발생할 때 화면에 메시지가 표시됩니다.

따라서 오류 메시지를 화면에 인쇄하는 대신 로그 파일이나 다른 위치로 리디렉션한다고 가정해 보겠습니다.

▍리디렉션 오류 흐름

이미 알고 있듯이 파일 핸들 STDERR은 2입니다. 리디렉션 명령 앞에 이 핸들을 배치하여 오류를 리디렉션할 수 있습니다.

Ls -l xfile 2>myfile cat ./myfile
이제 오류 메시지가 myfile로 이동됩니다.


오류 메시지를 파일로 리디렉션

▍오류 및 출력 스트림 리디렉션

명령줄 스크립트를 작성할 때 오류 메시지와 표준 출력을 모두 리디렉션해야 하는 상황이 있을 수 있습니다. 이를 달성하려면 적절한 설명자에 대한 리디렉션 명령을 사용하여 오류와 표준 출력이 이동해야 하는 파일을 지정해야 합니다.

Ls –l myfile xfile anotherfile 2> 오류 내용 1> 올바른 내용

오류 및 표준 출력 리디렉션

쉘은 1> 구성 덕분에 ls 명령이 일반적으로 STDOUT으로 보내는 내용을 올바른 콘텐츠 파일로 리디렉션합니다. STDERR로 이동하는 오류 메시지는 2> 리디렉션 명령으로 인해 errorcontent 파일에 표시됩니다.

필요한 경우 &> 명령을 사용하여 STDERR과 STDOUT을 모두 동일한 파일로 리디렉션할 수 있습니다.


STDERR 및 STDOUT을 동일한 파일로 리디렉션

명령이 실행된 후 STDERR 및 STDOUT에 대한 내용이 콘텐츠 파일에 저장됩니다.

스크립트에서 출력 리디렉션

명령줄 스크립트에서 출력을 리디렉션하는 방법에는 두 가지가 있습니다.
  • 임시 리디렉션 또는 단일 라인 출력 리디렉션.
  • 영구 리디렉션, 즉 스크립트 출력 전체 또는 일부의 리디렉션입니다.

▍임시 출력 리디렉션

스크립트에서는 한 줄의 출력을 STDERR로 리디렉션할 수 있습니다. 이렇게 하려면 리디렉션 명령을 사용하여 STDERR 설명자를 지정하고 설명자 번호 앞에 앰퍼샌드 문자(&)를 추가하면 됩니다.

#!/bin/bash echo "오류입니다." >&2 echo "정상 출력입니다."
스크립트를 실행하면 두 줄이 모두 화면에 나타납니다. 이미 알고 있듯이 기본적으로 오류는 일반 데이터와 같은 위치에 출력되기 때문입니다.


임시 리디렉션

STDERR 출력이 파일로 이동되도록 스크립트를 실행해 보겠습니다.

./myscript 2> 마이파일
보시다시피 이제 일반 출력이 콘솔로 전송되고 오류 메시지가 파일로 이동됩니다.


오류 메시지가 파일에 기록됩니다.

▍영구적인 출력 리디렉션

스크립트가 많은 출력을 화면으로 리디렉션해야 하는 경우 각 에코 호출에 적절한 명령을 추가하는 것은 불편합니다. 대신 exec 명령을 사용하여 스크립트 기간 동안 출력이 특정 핸들로 리디렉션되도록 설정할 수 있습니다.

#!/bin/bash exec 1>outfile echo "이것은 쉘 스크립트에서 다른 파일로 모든 출력을 리디렉션하는 테스트입니다." echo "모든 줄을 리디렉션할 필요 없이"
스크립트를 실행해 보겠습니다.


모든 출력을 파일로 리디렉션

출력 리디렉션 명령에 지정된 파일을 살펴보면 echo 명령으로 출력된 모든 내용이 해당 파일에 포함되어 있음을 알 수 있습니다.

exec 명령은 스크립트 시작 부분뿐만 아니라 다른 위치에서도 사용할 수 있습니다.

#!/bin/bash exec 2>myerror echo "이것은 스크립트의 시작입니다." echo "이제 모든 출력을 다른 위치로 리디렉션 중입니다." exec 1>myfile echo "이것은 myfile 파일로 이동해야 합니다." echo "그리고 이것은 이동해야 합니다. myerror 파일에" >&2
이는 스크립트를 실행하고 출력을 리디렉션한 파일을 확인한 후에 얻을 수 있는 것입니다.


출력을 다른 파일로 리디렉션

exec 명령은 먼저 STDERR의 출력을 myerror 파일로 리디렉션합니다. 그런 다음 여러 echo 명령의 출력이 STDOUT으로 전송되어 화면에 인쇄됩니다. 그런 다음 exec 명령은 STDOUT에 있는 모든 내용을 myfile 파일로 전송하고 마지막으로 echo 명령에서 STDERR에 대한 리디렉션 명령을 사용하여 해당 행이 myerror 파일에 기록되도록 합니다.

이것을 마스터하고 나면 출력을 원하는 위치로 리디렉션할 수 있습니다. 이제 입력 리디렉션에 대해 이야기해 보겠습니다.

스크립트에서 입력 리디렉션

입력을 리디렉션하려면 출력을 리디렉션하는 데 사용한 것과 동일한 기술을 사용할 수 있습니다. 예를 들어, exec 명령을 사용하면 파일을 STDIN의 데이터 소스로 만들 수 있습니다.

실행 0< myfile
이 명령은 입력 소스가 일반 STDIN이 아닌 myfile이어야 함을 쉘에 알려줍니다. 실제 입력 리디렉션을 살펴보겠습니다.

#!/bin/bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
스크립트를 실행한 후 화면에 나타나는 내용입니다.


입력 리디렉션

이전 기사에서는 read 명령을 사용하여 키보드에서 사용자 입력을 읽는 방법을 배웠습니다. 데이터 소스를 파일로 만들어 입력을 리디렉션하는 경우 읽기 명령은 STDIN에서 데이터를 읽으려고 할 때 키보드가 아닌 파일에서 읽습니다.

일부 Linux 관리자는 이 접근 방식을 사용하여 로그 파일을 읽은 다음 처리합니다.

자신만의 출력 리디렉션 만들기

스크립트에서 입력과 출력을 리디렉션하면 세 가지 표준 파일 설명자에 국한되지 않습니다. 앞서 언급한 대로 핸들을 최대 9개까지 열 수 있습니다. 3부터 8까지의 나머지 6개는 입력 또는 출력을 리디렉션하는 데 사용할 수 있습니다. 이들 중 하나를 파일에 할당하고 스크립트 코드에서 사용할 수 있습니다.

exec 명령을 사용하여 출력 데이터에 핸들을 할당할 수 있습니다.

#!/bin/bash exec 3>myfile echo "이것은 화면에 표시되어야 하며" echo "그리고 이것은 파일에 저장되어야 합니다" >&3 echo "그리고 이것은 화면에 다시 표시되어야 합니다"
스크립트를 실행한 후 출력의 일부가 화면에 표시되고 일부는 설명자 3이 있는 파일에 표시됩니다.


자체 핸들을 사용하여 출력 리디렉션

데이터 입력을 위한 파일 설명자 만들기

출력을 리디렉션하는 것과 동일한 방식으로 스크립트에서 입력을 리디렉션할 수 있습니다. 입력을 리디렉션하기 전에 STDIN을 다른 핸들에 저장하십시오.

파일 읽기를 마친 후 STDIN을 복원하고 평소대로 사용할 수 있습니다.

#!/bin/bash exec 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
시나리오를 시험해 보겠습니다.


입력 리디렉션

이 예에서는 파일 설명자 6이 STDIN에 대한 참조를 저장하는 데 사용되었습니다. 그런 다음 입력 리디렉션이 완료되고 파일이 STDIN의 데이터 소스가 되었습니다. 그런 다음 읽기 명령에 대한 입력은 리디렉션된 STDIN, 즉 파일에서 나왔습니다.

파일을 읽은 후 핸들 6으로 리디렉션하여 STDIN을 재설정합니다. 이제 모든 것이 올바르게 작동하는지 확인하기 위해 스크립트는 사용자에게 질문을 하고 키보드 입력을 기다린 후 입력된 내용을 처리합니다.

파일 핸들 닫기

쉘은 스크립트가 완료된 후 자동으로 파일 핸들을 닫습니다. 그러나 어떤 경우에는 스크립트 실행이 완료되기 전에 수동으로 핸들을 닫아야 합니다. 핸들을 닫으려면 &- 로 리디렉션되어야 합니다. 다음과 같습니다.

#!/bin/bash exec 3> myfile echo "이것은 데이터의 테스트 라인입니다" >&3 exec 3>&- echo "이것은 작동하지 않습니다" >&3
스크립트를 실행하면 오류 메시지가 나타납니다.


닫힌 파일 설명자에 액세스하려고 합니다.

문제는 존재하지 않는 설명자에 액세스하려고 시도했다는 것입니다.

스크립트에서 파일 핸들을 닫을 때 주의하십시오. 데이터를 파일로 보낸 다음 핸들을 닫았다가 다시 열면 쉘이 대체됩니다. 기존 파일새로운. 즉, 이전에 이 파일에 기록된 모든 내용이 손실됩니다.

열린 핸들에 대한 정보 얻기

Linux에서 열려 있는 모든 핸들 목록을 얻으려면 lsof 명령을 사용할 수 있습니다. Fedora와 같은 많은 배포판에서 lsof 유틸리티는 /usr/sbin에 있습니다. 이 명령은 시스템에 열려 있는 각 핸들에 대한 정보를 표시하므로 매우 유용합니다. 여기에는 백그라운드에서 실행 중인 프로세스가 여는 항목과 로그인한 사용자가 여는 항목이 포함됩니다.

이 명령에는 많은 키가 있습니다. 가장 중요한 키를 살펴보겠습니다.

  • -p 프로세스 ID를 지정할 수 있습니다.
  • -d 정보를 얻으려는 설명자의 번호를 지정할 수 있습니다.
현재 프로세스의 PID를 알아내려면 특수한 방법을 사용할 수 있습니다. 환경 변수쉘이 현재 PID를 쓰는 $$입니다.

-a 스위치는 다른 두 스위치를 사용하여 반환된 결과에 대해 논리적 AND 연산을 수행하는 데 사용됩니다.

Lsof -a -p $$ -d 0,1,2

열린 핸들에 대한 정보 표시

STDIN, STDOUT 및 STDERR과 연관된 파일 유형은 CHR(문자 모드)입니다. 모두 터미널을 가리키므로 파일 이름은 터미널에 할당된 장치 이름과 일치합니다. 세 가지 표준 파일 모두 읽기 및 쓰기가 가능합니다.

표준 설명자 외에도 다른 설명자가 열려 있는 스크립트에서 lsof 명령을 호출하는 방법을 살펴보겠습니다.

#!/bin/bash exec 3> myfile1 exec 6> myfile2 exec 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
이 스크립트를 실행하면 이런 일이 발생합니다.


스크립트로 열린 파일 핸들 보기

스크립트는 출력용 핸들 두 개(3 및 6)와 입력용 핸들(7)을 열었습니다. 설명자를 구성하는 데 사용되는 파일의 경로도 표시됩니다.

출력 억제

때로는 스크립트의 명령이 다음과 같이 실행될 수 있는지 확인해야 할 때가 있습니다. 백그라운드 프로세스, 화면에 아무것도 표시되지 않았습니다. 이렇게 하려면 출력을 /dev/null 로 리디렉션할 수 있습니다. 이것은 "블랙홀"과 같습니다.

다음은 오류 메시지를 표시하지 않는 방법에 대한 예입니다.

Ls -al badfile anotherfile 2> /dev/null
예를 들어 파일을 삭제하지 않고 지워야 하는 경우에도 동일한 접근 방식이 사용됩니다.

고양이 /dev/null > myfile

결과

오늘은 명령줄 스크립트에서 입력 및 출력이 작동하는 방식에 대해 배웠습니다. 이제 파일 설명자를 처리하고 파일 설명자를 생성하고 보고 닫는 방법과 입력, 출력 및 오류 스트림 리디렉션에 대해 알게 되었습니다. 이 모든 것은 bash 스크립트 개발에 매우 ​​중요합니다.

다음 시간에는 Linux 신호, 스크립트에서 이를 처리하는 방법, 예약된 작업 실행 및 백그라운드 작업에 대해 설명하겠습니다.

친애하는 독자 여러분! 이 자료는 입력, 출력 및 오류 스트림 작업의 기본 사항을 제공합니다. 우리는 여러분 중에 경험을 통해서만 얻을 수 있는 이 모든 것에 대해 말할 수 있는 전문가가 있다고 확신합니다. 그렇다면 우리는 당신에게 바닥을 전달합니다.

리디렉션은 일반적으로 명령 사이에 특수 문자 ">"를 삽입하여 수행됩니다. 일반적으로 구문은 다음과 같습니다.

명령1 > 파일1

command1을 실행하여 표준 출력을 file1에 기록합니다.

1팀< файл1

키보드 대신 file1을 입력 소스로 사용하여 command1을 실행합니다.

1팀< файл1 >파일2

이전 두 가지 옵션을 결합합니다. file1의 입력과 file2의 출력으로 command1을 실행합니다.

컨베이어

파이프라인은 여러 프로그램이 함께 작동하는 기능으로, 중간 임시 파일을 사용하지 않고 한 프로그램의 출력이 다른 프로그램의 입력으로 직접 이동됩니다. 통사론:

팀1 | 팀2

command2를 실행할 때 출력 스트림을 입력 스트림으로 사용하여 command1을 실행합니다. 이는 두 개의 리디렉션과 임시 파일을 사용하는 것과 같습니다.

명령1 > 임시파일 명령2< ВременныйФайл rm ВременныйФайл

명령 파이프라인의 좋은 예는 echo를 다른 명령과 결합하여 비대화형 환경에서 상호작용을 달성하는 것입니다. 예를 들면 다음과 같습니다.

echo -e "사용자 이름\n비밀번호" | FTP 로컬호스트

그러면 UserName으로 localhost에 연결하는 클라이언트가 시작되고 Enter 키를 누른 다음 비밀번호 Password를 입력합니다.

표준 파일 설명자에서/로의 리디렉션

안에 명령 셸 Bourne 쉘에서 발전한 UNIX는 리디렉션 문자 바로 앞에 숫자(파일 설명자)를 지정하여 이전 두 단계를 개선할 수 있습니다. 이 숫자는 리디렉션에 사용되는 스트림을 나타냅니다. UNIX에는 다음과 같은 표준 입출력 스트림이 있습니다.

예:

명령1 2 > 파일1

C 쉘에서 파생된 명령 쉘에서 구문 규칙에 따라 리디렉션이 수행되는 스트림을 나타내려면 리디렉션 문자 뒤에 & 문자를 추가해야 합니다.

종종 표준 오류 스트림은 표준 출력 스트림과 결합되어 오류와 일반 프로그램 출력을 함께 처리할 수 있습니다. 예:

/ -name .profile> results.txt 2>&1 찾기

.profile이라는 이름의 모든 파일을 찾으려고 시도합니다. 리디렉션 없이 이 명령을 실행하면 검색 결과가 로 전달되고 오류 메시지(예: 보호된 디렉터리에서 검색을 시도할 때 액세스 권한이 부족하다는 메시지)가 로 전달됩니다. 기본적으로 이러한 역할은 콘솔에서 수행됩니다. 표준 출력이 결과 파일로 전달되면 오류는 계속해서 콘솔로 전송됩니다. 오류와 검색 결과가 모두 results.txt 파일로 전송되도록 하기 위해 표준 오류와 출력 스트림은 다음을 사용하여 결합됩니다. 2>&1 .

글쓰기 2>&1 ~ 전에 > 통역사가 읽을 때 작동하지 않습니다. 2>&1 , 표준 출력 스트림이 어디로 리디렉션되는지 아직 알지 못하므로 오류 및 출력 스트림이 병합되지 않습니다.

결합된 결과가 다른 프로그램의 입력으로 파이프되는 경우 시퀀스는 2>&1 반드시 컨베이어 표지판 앞에 있어야 합니다. 예:

/ -name .profile 2>&1 찾기 | 더 적은

단순화된 명령 형식:

명령>파일2>&1

다음과 같습니다:

명령 &> 파일

명령>&파일

컨베이어 체인

리디렉션 및 파이핑 명령을 함께 연결하여 더 복잡한 명령을 생성할 수 있습니다. 예를 들면 다음과 같습니다.

ls | grep ".sh" | 정렬>목록

다음을 포함하는 행만 남기고 필터링된 현재 디렉터리의 내용 목록을 가져옵니다. ".쉿", 필터링된 목록은 어휘순으로 정렬되고 최종 결과는 파일에 저장됩니다. 목록. 이 유형의 구성은 UNIX 쉘 스크립트에서 흔히 발견됩니다.

여러 핀으로 리디렉션

표준 명령은 명령 출력을 한 번에 여러 위치로 리디렉션할 수 있습니다. 예:

Ls -lrt | 티 파일1

명령의 표준 출력을 지시합니다. ls -lrt(파일 목록) 콘솔과 모두에서 파일1.

추가하여 리디렉션

명령 셸에서 파일로 리디렉션하여 끝에 추가할 수 있습니다. 이 경우 파일에 저장된 정보는 삭제되지 않으나, 모두 삭제됩니다. 새로운 정보이 파일의 끝에 추가됩니다. 통사론:

명령1>> 파일1

삽입된 문서

일부 쉘 및 응용 언어(PHP), Perl에서는 내장 문서의 구문(Heredoc 구문 참조)을 허용하여 프로그램 파일 자체에서 입력 스트림을 지정할 수 있습니다. 예: cat « EOF Any 다음을 포함하여 텍스트가 여기에 배치됩니다. 특수 기호 EOF

포함된 문서 끝의 최종 서명 EOF(임의의 값을 사용할 수 있지만 의미에 따라 EOF가 자주 사용됨)는 줄의 시작 부분에서 시작해야 합니다.

모든 프로그램은 데이터를 처리하도록 설계된 "자동 기계"입니다. 하나의 정보를 입력으로 받고 작업의 결과로 다른 정보를 생성합니다. 들어오고 나가는 정보가 0일 수도 있지만, 즉 단순히 없을 수도 있습니다. 처리를 위해 프로그램으로 전송되는 데이터는 입력이고, 작업의 결과로 생성되는 데이터는 출력입니다. 각 프로그램의 입력과 출력을 구성하는 것은 운영 체제의 작업입니다.

각 프로그램은 텍스트, 그래픽, 사운드 등 특정 유형의 데이터로 작동합니다. 이미 분명해진 것처럼 Linux의 기본 시스템 관리 인터페이스는 사용자의 텍스트 정보를 시스템으로 전송하고 뒤쪽에. 터미널에서의 입력과 터미널로의 출력은 오직 텍스트 정보, 터미널과 관련된 프로그램의 입력 및 출력도 텍스트여야 합니다. 그러나 텍스트 데이터로 작업해야 하는 필요성은 시스템 관리 기능을 제한하지 않고 오히려 확장합니다. 사람은 모든 프로그램의 출력을 읽고 시스템에서 무슨 일이 일어나고 있는지 이해할 수 있습니다. 다양한 프로그램동일한 유형의 데이터 표현인 텍스트를 사용하기 때문에 서로 호환되는 것으로 나타났습니다.

명령과 스크립트는 표준 입력(키보드에 연결됨) 또는 파일의 두 가지 방법으로 입력을 받을 수 있습니다. 출력에도 비슷한 구분이 있습니다. 명령이나 스크립트의 출력은 기본적으로 터미널 화면으로 전송되지만 이를 파일로 리디렉션할 수 있습니다. 작동 중 오류가 발생한 경우. 이에 대한 메시지도 화면에 표시되며 오류 스트림을 파일로 리디렉션할 수도 있습니다.

먼저 I/O를 구성하는 데 사용할 수 있는 몇 가지 명령을 살펴보겠습니다.

표준 출력 장치에 대한 출력 명령

Linux는 메시지를 표준 출력으로 인쇄하는 여러 명령을 제공합니다.

  • echo - 문자열을 표준 출력으로 인쇄합니다.
  • printf - 서식이 지정된 텍스트를 표준 출력으로 인쇄합니다.
  • yes - 반복되는 텍스트를 표준 출력으로 인쇄합니다.
  • seq - 일련의 숫자를 표준 출력으로 인쇄합니다.
  • Clear 화면이나 창을 지웁니다.

예를 들어 echo 명령을 사용할 때 제어 문자 \c를 지정하면 출력이 완료될 때 다음으로 이동하지 않습니다. 새 줄:

$ echo "당신의 이름은 무엇입니까?\c"

당신의 이름은 무엇입니까?$

여기서 $는 초대 기호입니다.

이 라인은 쉘 변수 및 기타 명령의 값도 계산할 수 있습니다. 예를 들어, 다음 명령은 현재 사용자의 홈 디렉터리가 무엇인지 보고합니다( 환경 변수$HOME) 및 연결된 터미널(tty 명령은 역따옴표로 묶여 인터프리터가 해당 줄에 실행 결과를 표시합니다).

$ echo "귀하의 홈 디렉터리는 $HOME이고, 터미널 `tty`에 연결되어 있습니다. "

귀하의 홈 디렉토리는 /home/knoppix이고 터미널 - /dev/tty1에 연결되어 있습니다.

왜냐하면 큰따옴표쉘 인터프리터에는 특별한 약속, 출력 문자열에 큰따옴표를 포함하려면 백슬래시(\)를 사용하여 특수 목적을 취소해야 합니다. 이렇게 하면 특수 문자 할당이 취소됩니다.

예를 들어 "/dev/tty1" 문자열을 표시하려면 다음을 실행해야 합니다.

$echo “\”/dev/tty1\””

다음에서 명령을 입력하세요. 표준 장치입력

read 명령은 표준 입력에서 한 줄을 읽고 그 내용을 지정된 변수에 씁니다. 여러 변수를 지정하는 경우 첫 번째 단어가 첫 번째 단어에 기록되고 두 번째 단어가 두 번째 단어에 기록됩니다. 마지막 줄에는 나머지 줄이 포함됩니다.

다음 스크립트는 별도의 읽기 명령을 호출하여 각 변수를 읽습니다.


$ 고양이 테스트
#!/bin/bash
에코 "이름: \c"
이름을 읽어보세요
echo “성: \c”
성을 읽어라
echo “이름=” $name “성=” $surname

그런 다음 이 스크립트를 실행하려면 테스트 파일에 실행 권한(chmod 0755 test)을 부여하고 it./test를 실행해야 합니다. 실행 결과: 이름: Ivan 성: Petrov 이름=Ivan 성=Petrov

표준 입력, 출력 및 오류 스트림

각각은 다음에서 출시되었습니다. 명령 해석기프로그램은 세 개의 개방형 I/O 스트림을 수신합니다.

표준 입력(sldin) - 표준 출력(sldout) - 표준 오류 출력(stderr)

기본적으로 이러한 스레드는 터미널과 연결됩니다. 저것들. 표준 스트림 이외의 스트림을 사용하지 않는 프로그램은 터미널 키보드의 입력을 기다리며 오류 메시지를 포함한 해당 프로그램의 모든 출력은 터미널 화면에서 발생합니다.

게다가 쉘 인터프리터에서 실행되는 각 프로세스(명령, 스크립트 등)에는 여러 가지 관련 프로세스가 있습니다. 열린 파일, 프로세스가 데이터를 읽을 수 있고 쓸 수 있는 곳입니다. 이러한 각 파일은 파일 설명자라는 번호로 식별되지만 처음 세 파일은 기본 I/O 스트림입니다.

파일 설명자
표준 입력 스트림 0
표준 출력 1
표준 오류 스트림 2

실제로는 12개의 열린 파일이 생성되지만 설명자 0, 1, 2가 있는 파일은 표준 입력, 출력 및 오류용으로 예약되어 있습니다. 사용자는 파일 설명자 3~9(예약됨)가 있는 파일로 작업할 수도 있습니다.

표준 입력 파일(sldin)의 핸들은 0입니다. 이 파일에서 프로세스는 입력 데이터를 추출합니다. 기본적으로 입력 스트림은 키보드(장치 /dev/tty)와 연결되어 있지만 대부분 다른 프로세스나 일반 파일의 파이프를 통해 제공됩니다.

표준 출력 파일(stdout)에는 핸들 1이 있습니다. 프로세스의 모든 출력은 이 파일에 기록됩니다. 기본적으로 데이터는 터미널 화면(device/dev/tty)에 출력되지만 파일로 리디렉션되거나 다른 프로세스로 파이프될 수도 있습니다.

표준 오류 스트림(siderr) 파일에는 설명자 2가 있습니다. 명령 실행 중에 발생하는 오류 메시지가 이 파일에 기록됩니다. 기본적으로 오류 메시지는 터미널 화면(장치 /dev/tty)에 출력되지만 파일로 리디렉션될 수도 있습니다. 오류 로깅을 할당하는 이유는 무엇입니까? 특수 파일? 요점은 그것이 매우 중요하다는 것입니다. 편리한 방법명령 결과에서 실제 출력 데이터를 추출하고 좋은 기회다양한 유형의 저널 파일 유지 관리를 효과적으로 구성합니다.

많은 유틸리티는 표준 스트림만 사용합니다. 이러한 프로그램의 경우 셸을 사용하면 I/O 스트림을 독립적으로 리디렉션할 수 있습니다. 예를 들어 오류 메시지를 표시하지 않고 파일의 입력 또는 출력을 설정할 수 있습니다.

저것들. 명령을 호출할 때 입력을 수신할 위치와 출력을 전송할 위치는 물론 오류 메시지를 지정할 수 있습니다. 기본적으로 달리 지정하지 않는 한 터미널 작업을 가정합니다. 데이터는 키보드에서 입력되고 화면에 표시됩니다. 그러나 쉘 인터프리터에는 표준 스트림을 다른 파일과 연결할 수 있는 리디렉션 메커니즘이 있습니다. 이 경우 표준 오류 스트림을 리디렉션할 때 파일 설명자(2)를 지정해야 합니다. 입력 및 출력 스트림에는 필요하지 않습니다.

유용한 특별한 경우스레드 리디렉션 메커니즘 사용 - /dev/null로 리디렉션하여 화면에서 불필요한 메시지를 제거할 수 있습니다. 동일한 메커니즘을 사용하여 빈 파일을 만들 수 있습니다.

% cat myfile - 현재 디렉토리에 빈 파일 myfile을 생성합니다.

/dev/null은 소위 특수 파일입니다. "빈 장치" "기록된" 정보의 양에 관계없이 쓰기가 성공적으로 수행됩니다. /dev/null에서 읽는 것은 EOF 파일의 끝을 읽는 것과 같습니다.

I/O 스트림 리디렉션 DOS(보다 정확하게는 DOS OS는 UNIX에서 스트림을 리디렉션하는 구문을 채택함)처럼 다음 기호를 사용하여 수행됩니다.

- 표준 출력 스트림 리디렉션
- 추가 모드에서 표준 출력 스트림 리디렉션
- 표준 입력 스트림 리디렉션
- 구분 기호를 만날 때까지 표준 입력으로부터 데이터를 받습니다.

그러나 DOS와 달리 두 프로세스 사이에 프로그램 채널을 생성할 때 UNIX/Linux OS는 두 프로세스를 동시에 시작하고 시스템 버퍼를 통해 정보를 전송합니다(하드 디스크에 중간 기록 없이). 따라서 UNIX/Linux OS의 프로그램 채널은 매우 효과적인 방법교환. 시스템 버퍼가 오버플로되면(예를 들어 ``송신'' 프로그램이 ``수신'' 프로그램이 처리할 수 있는 것보다 더 빨리 정보를 채널에 출력하는 경우) OS는 버퍼가 오버플로될 때까지 채널에 쓰는 프로세스를 자동으로 일시 중지합니다. 해방되었습니다.

가장 일반적인 리디렉션 연산자

번호 구문 설명
1 명령 파일 표준 출력을 새 파일로 지정합니다.

2 명령 1 파일 표준 출력을 지정된 파일로 보냅니다.

3 파일 명령 표준 출력을 지정된 파일로 지정합니다(첨부 모드).

4 명령 파일 2&1 표준 출력 및 오류를 지정된 파일로 보냅니다.

5 명령 ​​2 file 표준 오류를 지정된 파일로 보냅니다.

6 명령 2 파일 지정된 파일에 표준 오류를 보냅니다(추가 모드).

7 명령 파일 2&1 표준 출력 및 오류를 지정된 파일로 전달합니다(첨부 모드).

8 명령 file1 file2 첫 번째 파일에서 입력을 받고 두 번째 파일로 출력을 보냅니다.

9 표준 입력으로서의 명령 파일은 지정된 파일로부터 데이터를 받습니다.

10 구분 기호 명령 구분 기호를 만날 때까지 표준 입력에서 데이터를 받습니다.

11 명령 &m 표준 입력으로 설명자 m이 있는 파일로부터 데이터를 받습니다.

12 명령 &m 표준 출력을 파일 설명자 m으로 지정합니다.

n&m 연산자를 사용하면 설명자 n이 있는 파일이 설명자 m이 있는 파일과 동일한 위치로 리디렉션될 수 있습니다. 명령줄에는 유사한 연산자가 여러 개 있을 수 있으며, 이 경우 왼쪽에서 오른쪽으로 계산됩니다.

exec 명령 및 파일 설명자 사용

exec 명령은 현재 쉘을 지정된 명령으로 대체합니다. 일반적으로 현재 인터프리터를 닫고 다른 인터프리터를 시작하는 데 사용됩니다. 그러나 다른 용도도 있습니다.

예를 들어 다음과 같은 명령은

Exec 파일은 지정된 파일을 모든 명령의 표준 입력으로 만듭니다. 그것을 수행
대화형 모드에는 의미가 없습니다. 스크립트에서 사용하기 위한 것입니다.
그 뒤에 오는 모든 명령은 파일에서 입력 데이터를 읽습니다. 이 경우
스크립트 끝에 명령이 있어야 합니다.

Exec &– 표준 입력 스트림을 닫습니다( 이 경우파일). 비슷한 기술이 사용됩니다
주로 로그아웃할 때 실행되는 스크립트에 있습니다.

exec 명령은 설명자가 0(stdin)인 파일에 대한 포인터입니다. 이 포인터는 스크립트 실행이 완료된 후에만 복원할 수 있습니다.
스크립트가 키보드에서 계속 데이터를 읽으려는 경우 저장해야 합니다.
이전 입력 스트림에 대한 포인터입니다. 다음은 이 작업을 수행하는 방법을 보여주는 짧은 스크립트입니다.

$ 고양이 f_desc
#!/bin/bash
3&0 0파일 실행
리넬 읽기
라인 2 읽기
실행 0&3
$1inel을 에코합니다.
에코 $line2

첫 번째 exec 명령은 파일 설명자 3에 표준 입력(stdin)에 대한 포인터를 저장합니다.
(3에서 9 사이의 정수가 허용됨) 그런 다음 열립니다. 파일 파일독서를 위해. 다음 두 개의 읽기 명령
파일에서 두 줄의 텍스트를 읽습니다. 두 번째 exec 명령은 포인터를 표준 입력으로 복원합니다.
파일이 아닌 stdin 파일과 연결되어 있습니다. 최종 echo 명령은 읽은 줄의 내용을 화면에 표시합니다.
linel 및 Iine2 변수에 저장되었습니다.

스크립트 결과:
$./f_desc
안녕하세요!
안녕!