유 닉 스 셸 입 출력 재 설정
1. 파일 설명자 (아래 부분 은 위 키 백과 에서 왔 습 니 다)
파일 설명자 (File descriptor) 는 컴퓨터 과학 의 용어 로 파일 을 가리 키 는 인용 을 표현 하 는 추상 화 개념 이다.
파일 설명 자 는 형식적 으로 부정 정수 이다.실제로, 이것 은 모든 프로 세 스 가 유지 하고 있 는 프로 세 스 를 가리 키 는 색인 값 입 니 다. 파일 의 기록 표를 엽 니 다.프로그램 이 기 존 파일 을 열 거나 새 파일 을 만 들 때 커 널 은 프로 세 스 에 파일 설명 자 를 되 돌려 줍 니 다.프로그램 설계 에서 일부 밑바닥 과 관련 된 프로그램 작성 은 종종 파일 설명 자 를 둘러싸 고 전개 된다.그러나 파일 설명자 라 는 개념 은 유 닉 스, 리 눅 스 같은 운영 체제 에 만 적용 된다.
파일 설명자 의 장점 은 주로 두 가지 가 있 습 니 다. 파일 설명자 기반 의 I/O 작업 호 환 POSIX 표준 입 니 다.UNIX, Linux 의 시스템 호출 에서 대량의 시스템 호출 은 파일 설명자 에 의존한다.파일 설명자 의 개념 은 두 가지 단점 이 있 습 니 다. 비 UNIX/Linux 운영 체제 (예 를 들 어 Windows NT) 에 서 는 이 개념 을 바탕 으로 프로 그래 밍 할 수 없습니다.파일 설명 자 는 형식적 으로 정수 에 불과 하기 때문에 코드 의 양 이 증가 할 때 프로 그래 밍 자 는 어떤 정수 가 데 이 터 를 의미 하 는 지 구분 하기 어렵 고 파일 설명 자 를 의미 하기 때문에 완 성 된 코드 의 가 독성 도 떨 어 집 니 다. 이 점 은 보통 마술 숫자 를 제거 함으로써 해결 합 니 다.
ANSI C 규범 에 정 의 된 표준 라 이브 러 리 의 파일 I/O 작업ANSI C 규범 은 FILE 구조 체 를 사용 하 는 지침 을 제시 했다.사실 UNIX/Linux 플랫폼 의 FILE 구조 체 의 실현 에는 파일 설명자 변수 가 포 함 된 경우 가 많다.
2. 입 출력 재 설정
2.1 stdin, stdout, stderr
쉽게 말 하면 파일 설명 자 는 열 린 파일 이나 장치 와 연 결 된 정수 로 열 린 파일 이나 장치 와 연 결 됩 니 다.가장 흔히 볼 수 있 는 파일 설명 자 는 stdin, stdout, stderr 입 니 다. 각각 0, 1, 2 이 고 시스템 에 보 존 된 파일 설명자 입 니 다. 각각 표준 입력, 표준 출력 과 표준 오류 에 대응 합 니 다.유 닉 스 시스템 은 기본적으로 이 세 개의 파일 설명 자 를 열 고 stdin 을 키보드 에 연결 하여 stdout 과 stderr 를 화면 에 연결 합 니 다.여기 서 입력 과 출력 을 바 꾸 는 것 은 주로 이 세 개의 파일 설명 자 를 우리 가 원 하 는 다른 파일 이나 장치 로 바 꾸 는 것 입 니 다.stdin 에 대해 stdout 과 stderr 의 방향 을 바 꾸 는 데 일반적으로 사용 하 는 조작 자 는 주로 <, > 와 > 가 있 습 니 다. 지정 한 구체 적 인 파일 조작 자가 없 는 상황 에서 결 성 된 것 은 다음 과 같 습 니 다. command < file. txt 는 command 0 < file. txt 에 해당 합 니 다. 즉, 기본적으로 파일 을 문서 설명자 0 으로 바 꾸 는 것 입 니 다.command > file. txt 는 command 1 > file. txt 에 해당 합 니 다. 즉, 기본적으로 파일 설명자 1 을 파일 로 바 꿉 니 다. >> 와 > 가 같 습 니 다.stderr 로 방향 을 바 꾸 려 면 command 2 > file. txt 와 같은 지정 한 정 보 를 file. txt 로 출력 해 야 합 니 다.
2.2 리 셋 입력
매번 수 동 으로 데 이 터 를 입력 하 는 것 을 피하 기 위해 서, 우 리 는 데 이 터 를 파일 에 기록 한 다음, 입력 을 이 파일 로 다시 설정 할 수 있 습 니 다.여기 서 보 여 주 는 것 은 Liux 의 cat 명령 입 니 다. cat 명령 은 인 자 를 추가 하지 않 으 면 표준 입력 을 읽 고 화면 에 출력 합 니 다. (실제로 cat 는 '-' 로 인 자 를 만 드 는 것 도 이 효과 입 니 다. cat -) 효 과 는 다음 과 같 습 니 다.
[lfqy@localhost ~]$ cat
Hello, world!
Hello, world!
Ni hao!
Ni hao!
I'm unhappy.
I'm unhappy.// ctrl+D EOF
[lfqy@localhost ~]$
아래 에 위의 내용 을 파일 test. txt 에 기록 한 다음 에 cat 의 입력 을 이 파일 로 바 꿉 니 다. 여기 서 사용 하 는 것 은 '<' 입 니 다. 이 조작 자 는:[lfqy@localhost ~]$ cat <test.txt
Hello, world!
Ni hao!
I'm unhappy.
[lfqy@localhost ~]$
실제로 위 에서 말 한 cat 0 < test. txt 효과 도 마찬가지다.물론, 여 기 는 cat 로 예 를 들 었 을 뿐, cat 로 파일 의 내용 을 보 려 면 이렇게 번 거 로 울 필요 가 있 습 니까?2.2 리 셋 출력
2.2.1 표준 입력 과 표준 오류
표준 오 류 를 테스트 하기 위해 먼저 test 디 렉 터 리 를 새로 만 든 다음 에 세 개의 파일 f1. txt, f2. txt 와 f. txt 를 만 들 었 습 니 다.f. txt 에 위의 몇 마디 를 쓰 고 f1. txt 와 f2. txt 의 권한 을 000 (chmod 000 f1. txt) 으로 설정 합 니 다.다음은 표준 출력 과 표준 오 류 를 각각 재 설정 합 니 다.
1、
[lfqy@localhost test]$ cat f*
cat: f1.txt: Permission denied
cat: f2.txt: Permission denied
Hello, world!
Ni hao!
I'm unhappy.
2、
[lfqy@localhost test]$ cat f* > stdout.txt
cat: f1.txt: Permission denied
cat: f2.txt: Permission denied
[lfqy@localhost test]$ cat stdout.txt
Hello, world!
Ni hao!
I'm unhappy.
3、
[lfqy@localhost test]$ cat f* 2> stderr.txt
Hello, world!
Ni hao!
I'm unhappy.
[lfqy@localhost test]$ cat stderr.txt
cat: f1.txt: Permission denied
cat: f2.txt: Permission denied
4、 stdout.txt, stderr.txt
[lfqy@localhost test]$ rm stderr.txt stdout.txt
[lfqy@localhost test]$ cat f* 2> stderr.txt >stdout.txt
[lfqy@localhost test]$ cat stderr.txt stdout.txt
cat: f1.txt: Permission denied
cat: f2.txt: Permission denied
Hello, world!
Ni hao!
I'm unhappy.
출력 방향 을 바 꾸 는 파일 이 존재 하지 않 으 면 이 파일 은 기본적으로 생 성 됩 니 다.파일 이 존재 하고 내용 이 있 으 면 원래 내용 이 비 워 집 니 다.물론 새로운 방향 을 바 꾸 는 내용 을 원래 내용 의 뒤에 추가 하려 면 위의 '>' 를 '>' 로 바 꾸 면 효과 가 있다.2.2.2 표준 출력 과 표준 출력 을 동시에 파일 로 재 설정 합 니 다.
이것 은 실현 하기 위해 여러 가지 방법 이 있 는데 방법 은 다음 과 같다.
1、cat f* &> stdall.txt
[lfqy@localhost test]$ cat f* &> stdall.txt
[lfqy@localhost test]$ cat stdall.txt
cat: f1.txt: Permission denied
cat: f2.txt: Permission denied
Hello, world!
Ni hao!
I'm unhappy.
2、cat f* 1> stdall0.txt 2>&1
[lfqy@localhost test]$ cat f* 1> stdall0.txt 2>&1
[lfqy@localhost test]$ cat stdall0.txt
cat: f1.txt: Permission denied
cat: f2.txt: Permission denied
Hello, world!
Ni hao!
I'm unhappy.
:
[lfqy@localhost test]$ cat f* 2>&1 1> stdall0.txt
cat: f1.txt: Permission denied
cat: f2.txt: Permission denied
위의 반 례 를 주의 하 십시오. cat f * 2 > & 1 > stdall 0. txt (표준 오 류 를 먼저 표준 출력 으로 바 꾸 면 표준 출력 이 바 뀌 지 않 고 화면 으로 출력 되 기 때문에 표준 오 류 를 화면 으로 바 꿀 수 있 습 니 다.) cat f * 1 > stdal 0. txt 2 > & 1 이 어야 합 니 다.(먼저 표준 출력 을 파일 로 재 설정 합 니 다. 이 럴 때 표준 출력 까지 의 모든 내용 이 파일 로 재 설정 되 기 때문에 나중에 표준 출력 으로 재 설정 하 는 표준 오류 도 파일 로 출력 됩 니 다.)위 1 은 약간 특수 한 조작 자 & > 를 사용 하여 표준 출력 과 표준 오 류 를 동시에 재 설정 할 수 있 습 니 다. 2 는 표준 오 류 를 표준 출력 으로 재 설정 한 다음 에 기준 을 재 설정 하여 목적 을 달성 하 는 것 입 니 다. 이들 의 실현 방향 은 약간 다 릅 니 다. 여기 서 cat f * 1 > stdall 0. txt 2 > & 1 을 사용 해 야 하 는 이 유 는 1 앞 에 & 를 추가 해 야 하 는 이 유 는 1 을 하나의 시스템 으로 기본 적 인 창 조 를 해 야 하기 때 문 입 니 다.만 든 파일 설명 자 는 & 로 참조 해 야 합 니 다. 아래 에 도 말씀 드 리 겠 습 니 다.
2.2.3 신규 스 킬 get
(1) 원 하지 않 는 출력 버 리 기
쓰레기통 과 유사 한 장치 파일 이 있 습 니 다:/dev/null. 원 하지 않 는 출력 을 이 파일 로 바 꾸 면 됩 니 다.
1、
[lfqy@localhost test]$ cat f* > /dev/null
cat: f1.txt: Permission denied
cat: f2.txt: Permission denied
2、
[lfqy@localhost test]$ cat f* 2> /dev/null
Hello, world!
Ni hao!
I'm unhappy.
3、 ( )
[lfqy@localhost test]$ cat f* 2> /dev/null 1>/dev/null
[lfqy@localhost test]$ cat f* &> /dev/null
[lfqy@localhost test]$ cat f* 1>/dev/null 2>&1
(2) 출력 을 파일 에 저장 하고 출력 을 화면 에 표시 합 니 다.때때로 우 리 는 프로그램의 출력 파일 을 저장 하고 프로그램의 출력 을 보고 싶 습 니 다. (위의 방향 을 바 꾸 면 출력 을 볼 수 없고 나중에 파일 을 볼 수 있 습 니 다) 명령 tee 를 사용 하면 표준 입력 의 내용 을 읽 고 표준 출력 으로 출력 하고 파일 에 기록 할 수 있 습 니 다. (tee - read from standard input and write to standard output and files)여기 서 주의해 야 할 것 은 명령 의 출력 을 파이프 로 보 내 고 tee 에서 파이프 의 입력 을 받 아야 하 며, 표준 출력 내용 만 파 이 프 를 통과 할 수 있 기 때문에 표준 오 류 를 표준 출력 으로 재 설정 해 야 합 니 다.
[lfqy@localhost test]$ cat f* 2>&1 | tee tee.txt
cat: f1.txt: Permission denied
cat: f2.txt: Permission denied
Hello, world!
Ni hao!
I'm unhappy.
[lfqy@localhost test]$ cat tee.txt
cat: f1.txt: Permission denied
cat: f2.txt: Permission denied
Hello, world!
Ni hao!
I'm unhappy.
존재 하지 않 는 파일 을 자동 으로 만 들 고 존재 하 는 파일 의 원래 내용 을 비 웁 니 다. 추가 모드 를 사용 하려 면 cat f * 2 > & 1 | tee - a tee. txt 를 사용 하 십시오.3. 사용자 정의 파일 설명 자 를 만 듭 니 다.
0, 1, 2 는 시스템 에 보 존 된 파일 설명자 입 니 다. 사용자 정의 파일 설명 자 를 만 들 수도 있 습 니 다. 사용자 정의 파일 설명 자 는 주로 세 가지 모드 가 있 습 니 다. 읽 기 전용 모드, 절단 모드 와 추가 모드 입 니 다. 파일 설명자 num 을 만 들 었 다 고 가정 하면 & num 을 사용 하여 참조 할 수 있 습 니 다. 위 에서 사용 한 & 1 이 바로 이 이치 입 니 다.
3.1 읽 기 전용 모드
"exec num < filename"을 사용 하여 읽 기 전용 모드 의 파일 설명 자 를 만 듭 니 다. 읽 기 전용 파일 설명 자 는 한 번 만 읽 을 수 있 습 니 다. 두 번 읽 으 려 면 파일 설명 자 를 다시 만들어 야 합 니 다.
[lfqy@localhost test]$ exec 5<f.txt
[lfqy@localhost test]$ cat <&5
Hello, world!
Ni hao!
I'm unhappy.
[lfqy@localhost test]$ cat <&5//
3.2 절단 모드차단 모드 란 이 파일 설명 자 를 만 들 때 해당 파일 의 원래 내용 이 비 워 지 는 것 을 말 합 니 다. "exec num > filename"을 사용 하 십시오.의 모드 에서 절단 모드 절단 모드 의 파일 설명 자 를 만 든 후 이 파일 설명자 에 출력 된 모든 내용 은 해당 파일 뒤에 순서대로 추 가 됩 니 다. 이 파일 설명자 가 만 들 기 전의 내용 만 비 워 집 니 다.
[lfqy@localhost test]$ cat f.txt
Hello, world!
Ni hao!
I'm unhappy.
[lfqy@localhost test]$ exec 7>f.txt
[lfqy@localhost test]$ cat f.txt
[lfqy@localhost test]$ echo "Love" >&7
[lfqy@localhost test]$ echo "Happy" >&7
[lfqy@localhost test]$ cat f.txt
Love
Happy
3.3 추가 모드"exec num >> filename"을 사용 하여 추가 모드 의 파일 설명 자 를 만 듭 니 다. 절단 모드 와 달리 이 파일 설명 자 를 만 들 때 해당 파일 의 원래 내용 이 삭제 되 지 않 습 니 다. 이 파일 설명자 에 출력 된 모든 내용 은 해당 파일 뒤에 순서대로 추 가 됩 니 다.
[lfqy@localhost test]$ cat f.txt
Love
Happy
[lfqy@localhost test]$ exec 8>>f.txt
[lfqy@localhost test]$ cat f.txt
Love
Happy
[lfqy@localhost test]$ echo "Friendship" >&7
[lfqy@localhost test]$ echo "Flair" >&7
[lfqy@localhost test]$ cat f.txt
Love
Happy
Friendship
Flair
좋 습 니 다. 파일 설명 부 는 오늘 여기까지 입 니 다. 나중에 새로운 내용 을 배 워 서 다시 보충 하 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LINUX 시리즈(1부)UNIX는 1969년 AT&T에서 개발한 운영 체제입니다. UNIX는 다중 사용자, 다중 프로세스 운영 체제입니다. 기본적으로 사용 가능한 두 가지 기본 UNIX 버전이 있습니다. 대부분의 UNIX 버전은 이러한 버...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.