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