[bash] 파일 설명자, 리 셋 및 tee 명령
8507 단어 shell파일 설명자 와 재 설정
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.