파일 디스크립터 및 쉘 스크립팅


32

쉘 스크립트에서 파일 설명자를 사용하는 방법을 이해하는 데 어려움을 겪고 있습니다.

나는 같은 기본을 알고

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

내가 이해하는 것처럼 &5fd를 닫으면 각 호출 후에 어떻게 출력이 계속 성공적으로 리디렉션됩니까?

이것은에서 복사 파스타입니다 : 여기

그것은 이것을 단순 echo $a > file하게 사용하는 것이 훨씬 빠를 것이라고 주장 하지만, 나는 이해하지 못한다. 괜찮은 튜토리얼에 대한 링크를 부탁드립니다. 나는 구글 파워가 실패한 것 같다.

답변:


44

첫째, 폐쇄에 대한 구문은 참고 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태그를 찾아 보면 다른 몇 가지 리디렉션 예제를 찾을 수 있습니다 .


1
파일 디스크립터를 닫기위한 구문은 실제로 동일한 작업을 수행합니다.
user1338062
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.