파일 설명자 및 쉘 스크립트

파일 설명자 및 쉘 스크립트

쉘 스크립트에서 파일 설명자를 사용하는 방법을 이해하는 데 문제가 있습니다.

나는 다음과 같은 몇 가지 기본 사항을 알고 있습니다.

exec 5 > /tmp/foo

따라서 fd 5는 쓰기를 위해 foo에 첨부됩니다.

exec 6 < /tmp/bar

...읽기 위해서요.

exec 5>&-

...fd를 닫습니다.

이제 이것은 무엇을 합니까?

#!/bin/bash

exec 5 > /tmp/foo 
exec 6 < /tmp/bar 

cat <&6 | while read a
do
     echo $a >&5
done

fd를 닫는 것에 대해 내가 이해한 바에 따르면 &5, 각 호출 후에 출력이 어떻게 성공적으로 리디렉션될 수 있습니까?

다음은 파스타 복제본입니다.여기

단순 대신 이것을 사용하면 속도가 더 빨라질 것이라고 주장 echo $a > file하지만 이해할 수 없습니다. 괜찮은 튜토리얼에 대한 링크를 제공해 주시면 감사하겠습니다. 내 Google 능력이 나에게 실패한 것 같습니다.

답변1

먼저, 파일 설명자가 쓰기용인지 읽기용인지에 따라 close 구문은 5>&-또는 입니다. 6<&-이 블로그 게시물에 오타나 형식 오류가 있는 것 같습니다.

주석이 달린 스크립트입니다.

exec 5>/tmp/foo       # open /tmp/foo for writing, on fd 5
exec 6</tmp/bar       # open /tmp/bar for reading, on fd 6
cat <&6 |             # call cat, with its standard input connected to
                      # what is currently fd 6, i.e., /tmp/bar
while read a; do      # 
  echo $a >&5         # write to fd 5, i.e., /tmp/foo
done                  # 

여기에는 폐쇄가 없습니다. 이 간단한 예에서는 모든 입력과 출력이 동일한 위치로 이동하므로 추가 파일 설명자를 사용할 필요가 없습니다. 당신은 쓸 수 있습니다

cat </tmp/bar |
while read a; do
  echo $a
done >/tmp/foo

명시적 파일 설명자를 사용하면 여러 파일에 차례로 쓰려는 경우 유용합니다. 예를 들어, 데이터 출력 파일에 데이터를 출력하고 가능한 오류 메시지와 함께 데이터를 로그 파일에 기록하는 스크립트를 생각해 보세요. 이는 3개의 출력 채널을 의미합니다. 하나는 데이터용, 하나는 로그용, 다른 하나는 오류용입니다. 표준 출력 설명자는 두 개뿐이므로 세 번째 설명자가 필요합니다. exec다음을 호출하여 출력 파일을 열 수 있습니다 .

exec >data-file
exec 3>log-file
echo "first line of data"
echo "this is a log line" >&3
if something_bad_happens; then echo error message >&2; fi
exec >&-  # close the data output file
echo "output file closed" >&3

다음과 같이 루프에서 리디렉션을 수행할 때 효율성에 대한 설명이 제공됩니다(처음부터 파일이 비어 있다고 가정).

while …; do echo $a >>/tmp/bar; done

각 반복에서 프로그램은 를 열고 /tmp/bar, 파일의 끝을 찾고, 일부 데이터를 추가하고, 파일을 닫습니다. 파일을 한 번에 여는 것이 더 효율적입니다.

while …; do echo $a; done >/tmp/bar

여러 리디렉션이 서로 다른 시간에 발생하는 경우 exec리디렉션에서 블록을 래핑하는 대신 리디렉션 실행을 호출하는 것이 유용합니다.

exec >/tmp/bar
while …; do echo $a; done

당신은 다른 여러 가지를 찾을 수 있습니다이 사이트 태그 찾아보기를 통한 io-redirection리디렉션의 예.

답변2

열려 있는 각 파일에는 파일 설명자가 할당됩니다. stdin의 파일 설명자는 0, stdout은 1,
stderr은 2입니다. 다른 파일을 열려면 설명자 3~9도 예약되어 있습니다.

예를 들어

exec 3>&1 4>&2
exec 1>  /proc/1/fd/1 2>&1

3>&1새 파일 설명자를 생성하고 이를 1(STDOUT)로 리디렉션하고 4>&2새 파일 설명자를 2(STDERR)로 리디렉션합니다.

1> /proc/1/fd/1소켓 파일 설명자를 사용하면 2>&1이 파일 설명자의 모든 내용이 1(STDOUT)로 리디렉션됩니다.

저도 최근에 알게 된 내용이라 부족한 점이 있으면 지적해 주세요.

exec를 사용한 리디렉션 및 파일 설명 사용에 대한 참조 https://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/x13082.html

관련 정보