[bash] 파일 설명자, 리 셋 및 tee 명령

1. 파일 설명자 의 개념:
Linux 는 모든 커 널 대상 을 파일 로 처리 하고 시스템 은 sizet 형식 은 파일 대상 을 표시 합 니 다. 예 를 들 어 파일 설명자 0 은 시스템 의 표준 입력 장치 인 stdIN 을 표시 합 니 다. 보통 stdIN 의 값 은 키보드 입 니 다. 예 를 들 어 read 명령 은 기본적으로 stdIN 에서 데 이 터 를 읽 습 니 다. 물론 stdIN 의 값 은 바 꿀 수 있 습 니 다. 예 를 들 어 다른 파일 로 바 꾸 면 read 등 명령 은 해당 파일 에서 데 이 터 를 읽 습 니 다.
쉽게 말 하면 파일 설명 자 는 파일 과 연결 할 수 있 습 니 다. 연결 하면 주소 연산 자 & 이 파일 의 핸들 을 얻 을 수 있 습 니 다. 예 를 들 어 & 0 은 stdIN 장치 가 메모리 에 있 는 핸들 (장 치 는 시스템 에서 도 파일 로 처리) 을 얻 을 수 있 습 니 다. 셸 의 일반 변수 var 라면 이해 할 수 있 습 니 다.$var 형식 으로 이 변수 가 대표 하 는 값 을 얻 을 수 있 으 며, 파일 설명자 fd 에 대해 서 는 & fd 형식 으로 파일 설명자 가 가리 키 는 파일 의 핸들 을 얻 을 수 있 으 며, 이 핸들 은 이 파일 의 경 로 를 간단하게 이해 할 수 있 습 니 다.
Linux 에 서 는 기본적으로 세 개의 고정된 파일 설명자 0, 1, 2 를 보존 하고 있 습 니 다. 각각 stdIN, stdOUT, stdERR 을 표시 합 니 다. 각각 표준 입력 장치, 표준 출력 장치 와 표준 오류 출력 장 치 를 표시 합 니 다. 그들의 기본 값 은 키보드, 화면 과 화면 입 니 다. 그 구체 적 인 값 은 이 세 장치 가 대표 하 는 파일 의 파일 경로 로 이해 할 수 있 습 니 다.일부 명령 은 기본적으로 이 세 개의 장 치 를 사용 하여 입 출력 을 합 니 다. 예 를 들 어 read 는 stdIN (0) 을 사용 합 니 다. echo 는 stdOUT (1) 를 사용 합 니 다. 명령 이 잘못 되 거나 프로그램 오류 등 잘못된 정 보 를 사용 하 는 출력 은 기본적으로 stdERR (3) 을 사용 합 니 다. 즉, 기본적으로 이 오류 정 보 를 터미널 에 인쇄 하지만 이 세 파일 설명자 의 값 은 마음대로 바 꿀 수 있 습 니 다.즉, & 0, & 1 과 & 2 의 값 을 마음대로 바 꿀 수 있다.
2. stdIN 프로필:
예 를 들 어 cat 명령 은 인자 가 없 으 면 기본적으로 stdIN 에서 데 이 터 를 받 을 수 있 습 니 다. (즉, 키보드 에서 데 이 터 를 받 습 니 다) 방금 말 한 것 처럼 다음 두 명령 은 등가 입 니 다.
cat
cat < & 0\# & 0 은 stdIN 의 값 입 니 다. stdIN 에서 데 이 터 를 읽 는 것 을 의미 합 니 다.
물론 cat < test. txt 와 같은 다른 곳 에서 도 파일 을 읽 을 수 있 기 때문에 & 0 을 파일 설명자 0 이 대표 하 는 파일 의 경로 로 볼 수 있 습 니 다.
3. stdOUT 프로필:
예 를 들 어 ls 명령 은 결 과 를 기본적으로 stdOUT 장치 에 출력 하 는 것 이기 때문에 다음 두 명령 은 등가 입 니 다.
ls
ls > & 1\# & 1 은 stdOUT 의 값 으로 화면 단말기 가 시스템 에서 대표 하 는 파일 경로 로 이해 할 수 있 습 니 다.
물론 다른 곳 으로 출력 할 수도 있 습 니 다. 예 를 들 어 ls > test. txt.
주의!파일 설명자 fd 에 주 소 를 가 져 올 때 반드시 재 설정 문자 와 바짝 붙 어야 합 니 다. 예 를 들 어 > $fd, < & fd, 그렇지 않 으 면 잘못 보고 할 수 있 습 니 다!
4. 오류 리 셋 과 리 셋 부 호 를 이용 하여 파일 설명 자 를 할당 합 니 다:
우 리 는 파일 설명자 의 값 을 주 소 를 찾 은 후의 값 으로 형상 적 으로 봅 니 다. 예 를 들 어 파일 설명자 3 의 값 은 & 3 입 니 다. 즉, 이 설명자 가 대표 하 는 파일 의 핸들 (즉 파일 의 경로) 입 니 다.
잘못된 사용 명령, 예 를 들 어 존재 하지 않 는 파일 보기: ls xxxx
위 명령 을 실행 한 후 오류 정 보 는 터미널 에 직접 인쇄 됩 니 다. stdERR (2) 의 값 은 터미널 이지 만 오류 정 보 를 다른 곳 에 인쇄 하려 면 stdERR 의 값 을 수정 해 야 합 니 다.
수 정 된 법칙 은 Shell 에서 일반 변수 에 대한 할당 과 유사 합 니 다.
var = test. txt, 물론 파일 설명 자 는 직접 이렇게 값 을 부여 할 수 없습니다. 2 = test. txt 가 아니 라 출력 리 셋 부 호 를 통 해 값 을 부여 합 니 다. 2 > test. txt. 그 중에서 fd 는 리 셋 부호 와 바짝 붙 어야 합 니 다. 그렇지 않 으 면 오 류 를 보고 할 수 있 습 니 다. 그러나 리 셋 부 호 는 빈 칸 을 가 질 수 있 습 니 다. 그러나 여기 의 할당 값 은 두 가지 의미 가 있 습 니 다. 첫 번 째 층 은 할당 을 말 합 니 다.두 번 째 층 은 연결 되 어 있 는 파일 이 출력 성질 인지 입력 성질 인지 표시 합 니 다. 예 를 들 어 사용 > 은 출력 성질 을 의미 합 니 다. test. txt 파일 은 출력 파일 로 사 용 됩 니 다. 프로그램의 정 보 는 이 파일 에 출력 됩 니 다. < 는 입력 할당 이 라면 연결 되 어 있 는 파일 은 입력 장치 로 사 용 됩 니 다.프로그램의 데 이 터 는 이 파일 에서 읽 습 니 다.
마찬가지 로 변수 간 의 상호 할당 도 있 습 니 다.
var = $var 1, 파일 설명자 간 에 도 서로 값 을 부여 할 수 있 습 니 다. 다만 이러한 형식 이 아 닙 니 다. 3 = $5 가 아니 라 3 > & 5 입 니 다. 이 는 5 가 대표 하 는 파일 의 핸들 을 3 에 할당 하고 5 와 연 결 된 파일 과 3 을 연결 하 는 동시에 3 을 출력 장치 로 사용 하 는 것 을 의미 합 니 다. < 이면 3 을 입력 장치 로 사용 하 는 것 을 의미 합 니 다.
이렇게 해서 stdERR 의 값 을 바 꾸 려 면 이렇게 사용 할 수 있 습 니 다: ls xxx 2 > err. txt. 이때 오류 정 보 는 err. txt 로 출력 되 었 습 니 다. 그러나 여기 서 stdERR 에 대한 수정 은 임시 적 인 것 일 뿐 이 명령 에 만 유효 합 니 다. 이 줄 이 끝 난 후에 stdERR 은 터미널 화면 을 가리 키 고 있 습 니 다.
5. 데이터 와 오류 정 보 를 동시에 재 설정 하 는 작은 예:
ls -al test.txt xxxx 2> err.txt
이 때 xxxx 의 오류 정보 만 err. txt 로 출력 되 고 stdOUT (1) 의 값 은 할당 되 지 않 았 기 때문에 test. txt 에 대한 정확 한 정 보 는 터미널 화면 에 출력 되 었 습 니 다.
동시에 방향 을 바 꾸 면 다음 과 같 으 면 됩 니 다.
ls - al test. txt xxxx 1 > ok. txt 2 > err. txt, 물론 아래 도 가능 합 니 다.
ls - al test. txt xxxx > ok. txt 2 > err. txt 입 니 다. 출력 이 왼쪽으로 바 뀌 면 파일 설명 자 를 지정 하지 않 으 면 기본 값 은 1 (stdOUT) 입 니 다.
6. 명령 의 모든 출력 을 같은 파일 로 보 내기:
하나의 특수 한 파일 설명자 &, 그것 은 두 개의 출력 설명자 의 합 체, 즉 & = 1 | 2 입 니 다. 예 를 들 어:
ls test. txt xxxx & > log. info 는 ls test. txt xxxx 1 > log. info 2 > log. info 와 같은 특징 이 있 습 니 다.전체 파일 에서 잘못된 정 보 를 함부로 찾 지 않 아 도 된다.
7. 임시로 방향 을 바 꾸 는 간단 한 예:
#!/bin/bash

echo This is a error message! >&2
echo This is a normal output
$ bash test.sh	#             STDERR        
This is a error message!
This is a normal output
$ bash test.sh 2> test.txt	#STDERR     test.txt
This is a normal output
$ cat test.txt
This is a error message!

8. 자신의 방향 변경 만 들 기:
한 스 크 립 트 에서 최대 9 개의 설명 자 를 사용 할 수 있 습 니 다 (0 ~ 8)
#!/bin/bash

#exec                         (   exec     )
#         exec          
exec 3> test.txt	#          

echo This should display on the monitor
echo and this should be stored in the file >&3
echo Then this should be back on the monitor

exec 3>&1	#            3   ,          ,          
echo This should display on the monitor >&3

exec 4>> test.txt	#       
echo Appending part in the file >&4

exec 5>&1	#     1  
exec 1> info.txt
echo In info.txt
exec 1>&5	#     
echo Back on the monitor
$ bash test.sh
This should display on the monitor
Then this should be back on the monitor
This should display on the monitor
Back on the monitor
$ cat test.txt
and this should be stored in the file
Appending part in the file
$ cat info.txt
In info.txt
또 다른 작은 예:
#!/bin/bash

exec 2> err.info

echo 11111
echo 22222

exec 1> test.txt
echo 3333
echo 4444 >&2
$ bash test.sh
This should display on the monitor
Then this should be back on the monitor
This should display on the monitor
Back on the monitor
$ cat test.txt
and this should be stored in the file
Appending part in the file
$ cat info.txt
In info.txt
방향 을 바 꾸 는 예 를 입력 하 십시오.
#!/bin/bash

exec 6<&0	#    
exec 0< read.txt

cnt=1
while read line#      !
do
	echo "Line #$cnt: $line"
	cnt=$[ $cnt + 1 ]
done

exec 0<&6	#  
read -n1 -p "Are you done now [Y/N]? "
echo
case $REPLY in
	Y | y) echo Goodbye!;;
	N | n) echo Sorry, this is in the end;;
esac
같은 효 과 를 가 진 예:
#!/bin/bash

exec 3< read.txt

cnt=1
while read line <&3
do
	echo "Line #$cnt: $line"
	cnt=$[ $cnt + 1 ]
done

9. 파일 설명자 닫 기:
해당 파일 설명자 에 빈 포인터 NULL 을 부여 하면 됩 니 다. 그러나 파일 설명 자 는 NULL 이 말 하지 않 았 습 니 다. 그러나 특수 한 파일 설명자 - NULL 을 표시 하기 때문에 exec fd > & - 만 있 으 면 됩 니 다. 또는 exec fd < & - 도 됩 니 다. 전 자 는 출력 을 닫 고 후 자 는 입력 을 닫 았 습 니 다. 닫 은 후에 사용 하려 고 시도 하면 오류 가 발생 합 니 다.
#!/bin/bash

exec 3> test.txt
echo This is a test line >&3

exec 3>&-
echo "This won't work" >&3
$ bash test.sh
test.sh: line 7: 3: Bad file descriptor
출력 방향 을 바 꾸 고 닫 은 후에 열 면 출력 이 복 개 됩 니 다.
#!/bin/bash

exec 3> test.txt
echo This is a test line >&3
exec 3>&-

echo "cat test.txt"
cat test.txt

echo Reopen it
exec 3> test.txt	#  >>     
echo Haha! >&3

echo "cat test.txt again"
cat test.txt

10. 재 미 있 는 읽 기와 쓰기 재 설정:
#!/bin/bash

echo "cat test.txt"
cat test.txt

echo "processing..."
exec 3<> test.txt   #         
read line <&3
echo This is a test line >&3
echo "done."

echo "cat test.txt again"
cat test.txt
$ bash test.sh
cat test.txt
This is the first line.
This is the second line.
This is the third line.
processing...
done.
cat test.txt again
This is the first line.
This is a test line	#    ,         ,            ,                ,                        ,               
ine.
This is the third line.

11. 출력 을 막 기 위해 블랙홀 로 끌 어 옵 니 다:
블랙홀 파일 은 특수 한 장치 입 니 다./dev/null 은 이 파일 에 출력 된 모든 정 보 를 잃 어 버 리 고 이 파일 에서 읽 은 정 보 는 비어 있 습 니 다. 이름 null 과 같 습 니 다.
예 를 들 어 ls - l xxx 2 >/dev/null 은 잘못된 정 보 를 표시 하지 않 습 니 다.
cat/dev/null > test. txt, 파일 하 나 를 비우 고 번 거 롭 지 않 게 rm 에서 두 걸음 더 터치 할 필요 가 없습니다.
12. tee 명령 을 사용 하여 터미널 에 도 정 보 를 기록 파일 에 저장 합 니 다.
#!/bin/bash

#tee     T      ,        ,         
#          
date | tee info.txt
cat info.txt

who | tee -a info.txt	#-a    ,        
cat info.txt

좋은 웹페이지 즐겨찾기