![Linux에서 파일을 참조할 수 있는 **출력**에는 4가지 유형이 있습니다. 이것이 사실인가요?](https://linux55.com/image/109303/Linux%EC%97%90%EC%84%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%B0%B8%EC%A1%B0%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%8A%94%20**%EC%B6%9C%EB%A0%A5**%EC%97%90%EB%8A%94%204%EA%B0%80%EC%A7%80%20%EC%9C%A0%ED%98%95%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%EC%9D%B4%EA%B2%83%EC%9D%B4%20%EC%82%AC%EC%8B%A4%EC%9D%B8%EA%B0%80%EC%9A%94%3F.png)
도출할 수 있는 결론에는 4가지 유형이 있습니까?스트림 출력명령을 실행한 후 CLI에 파일이 표시되는 것을 원하지 않는 경우 Linux에서 파일을 참조할 수 있습니까?
파일에 대한 가능한 참조:
- 모든 스트림 출력
- 표준 오류만
- 표준 출력만 해당(표준 출력의 최종 결과 포함).
- stdout 및 stderr(stdout의 최종 결과 제외)
노트:
숫자 4의 예는 다음과 같습니다 find / -type f -name php.ini 2>/dev/null
. 내가 아는 한, 이 명령을 사용하면 표준 오류나 표준 출력이 발생하지 않습니다(예외표준 출력의 최종 결과이 경우 이는 우리가 검색하는 파일입니다(발견된 경우).
답변1
Unix 시스템의 모든 프로세스에는 두 개의 출력 스트림이 연결되어 있습니다.표준 출력(stdout, 파일 설명자 1) 및표준 에러(stderr, 파일 설명자 2). 이들은 서로 독립적으로 리디렉션될 수 있습니다.표준 입력파일 설명자 0을 사용합니다.
- 표준 출력을 파일로 리디렉션하려면 또는 더 명시
file
적인 . 폐기된 데이터 로 대체되었습니다 .>file
1>file
file
/dev/null
- 표준 오류 를 파일로 리디렉션하려면
file
.2>file
- 표준 오류를 표준 출력이 있는 위치로 리디렉션하려면
2>&1
. - 표준 출력을 표준 오류 위치로 리디렉션하려면
1>&2
.
프로세스의 흐름이나 "최종 결과"라는 개념이 없습니다. 표준 출력으로 전송된 모든 항목이 프로세스의 "결과"로 간주되기를 바랍니다. 단, 자체적으로 열었거나 다른 부작용(예: 디렉터리에서 파일 링크를 해제하는 등)이 있는 일부 파일에 데이터를 출력하지 않는 한 프로세스의 "결과"로 간주됩니다. ) rm
또는 경우에 따라 여러 네트워크 연결을 처리합니다 sshd
. 또한 프로세스는 프로세스의 "결과"로 간주될 수 있는 종료 상태("성공"의 경우 0, "실패"의 경우 0이 아님)를 반환하지만 이는 반드시 프로세스의 출력 스트림과 관련이 있는 것은 아닙니다.
스트림은 다음으로 리디렉션될 수도 있습니다.추가 모드즉, 파일로 리디렉션하면 처음에는 파일이 잘리지 않고 스트림의 모든 데이터가 파일 끝에 추가됩니다. >>file
대신 를 사용하여 이 작업을 수행합니다 >file
.
질문의 의견에서 명령은
find / -type f -name php.ini 2>/dev/null
주어진. 리디렉션(폐기)오직표준 에러. 표준 출력 스트림은 전혀 리디렉션되지 않으므로 콘솔이나 터미널에 완전히 표시됩니다. 파이프 중간에 있는 경우 표준 출력 스트림은 파이프에 있는 다음 명령의 표준 입력으로 공급됩니다.
대체로 다음과 같습니다.둘(4개가 아님) 출력 스트림. 콘텐츠 삭제를 포함하여 다양한 방법으로 독립적으로 리디렉션될 수 있습니다.
답변2
모든프로세스관례적으로 세 가지 표준 파일 설명자를 사용할 수 있습니다. 이러한 파일 설명자는 스트림으로 사용 가능합니다: stdin
, stdout
및 stderr
.
기본적으로 셸(CLI)에서 프로세스를 시작하면 첫 번째 프로세스는 터미널(또는 xterm과 같은 터미널 에뮬레이터)의 입력에 연결되고 나머지 두 프로세스는 터미널의 출력에 연결됩니다.
/dev/null
예를 들어 삼키는 곳 과 같은 다른 곳으로 리디렉션하도록 쉘에 지시할 수 있습니다 . stdout
이 작업은 및 에 대해 독립적으로 수행 할 수 있습니다 stderr
. 따라서 이 상황에는 실제로 네 가지 가능성이 있습니다.
command
command > /dev/null
command 2> /dev/null
command > /dev/null 2> /dev/null
하지만 둘 중 하나 또는 둘 다를 다른 곳으로 리디렉션하는 것을 막을 수는 없습니다.
command > /tmp/myout 2> /tmp/myerr
이 경우 터미널에 어떤 출력도 얻지 못하지만 /tmp/myout
나중에 파일 및 /tmp/myerr
.
답변3
상황은 귀하의 질문에서 알 수 있는 것보다 더 간단하면서도 더 복잡합니다. 뭔지 설명좀 해줄게선행은 이루기가 어렵다에서 말했다그의 대답, 규칙에 따라 구성되고 출력에 사용되는 두 개의 표준(일반) I/O 스트림(파일 설명자)이 있습니다: stdout(파일 설명자 1) 및 stderr(파일 설명자 2). 우리의 규범적인 문제, 쉘의 제어 및 리디렉션 연산자는 무엇입니까?에서는 리디렉션하는 방법에 대해 설명합니다. 순진하게도 다섯 가지 조합을 열거할 수 있습니다.
╔══════════════════════════════╦═════════════════════════════════════════════╗
║ ║ stderr ║
║ ╟─────────────────────┬───────────────────────╢
║ ║ default │ ║
║ ║ (same as the shell) │ redirected ║
╠════════╤═════════════════════╬═════════════════════╦═══════════════════════╣
║ │ default ║ ║ ║
║ │ (same as the shell) ║ 1 ║ 2 ║
║ ├─────────────────────╠═════════════════════╬═══════════════════════╣
║ stdout │ ║ ║ 4. redirected ║
║ │ ║ ║ to the same file ║
║ │ redirected ║ 3 ╟───────────────────────╢
║ │ ║ ║ 5. redirected ║
║ │ ║ ║ to different files ║
╚════════╧═════════════════════╩═════════════════════╩═══════════════════════╝
그러나 /dev/null
추가 모드를 파일과 구별하고, 추가 모드를 쓰기 전용 모드와 구별하고, 파이프를 파일과 구별하면 조합 수가 기하급수적으로 늘어납니다. 그러나 반복해서 지적했듯이 "stdout의 최종 결과"는 표준 Unix/Linux/bash 문구가 아닙니다.
단 두개?
다른 답변은 (아마도 현명하게도) stdout 및 stderr(파일 설명자 1 및 2)로 제한됩니다. 나는 (무모하게도?) 이 질문에 대한 완전한 대답은 다른 파일 설명자가 최대 수백, 수천, 심지어는 사용 가능하다는 사실을 다루어야 한다고 믿습니다.백만 이상. 예를 들어 비슷한 명령을 실행하면 diff file1 file2
프로그램 이 diff
열리고 커널은 파일 설명자 3과 4를 할당할 수 있습니다. 차이점은 파일 설명자 0, 1, 2만 미리 정의되어 있다는 것입니다. 2보다 큰 파일 설명자를 리디렉션하는 방법은 다음 위치에서 설명됩니다.file1
file2
- Bash 참조 매뉴얼: 섹션 3.6 리디렉션
- 고급 Bash 스크립팅 가이드: 20장 I/O 리디렉션
- 2>&-, 2>/dev/null, |&, &>/dev/null 및 >/dev/null 2>&1의 차이점(U&L 이슈)
- 일반적인 stdin/stdout/stderr(0, 1, 2)보다 더 많은 파일 설명자를 가질 수 있습니까?(스택 오버플로 질문)
예를 들어 다음의 높은 파일 설명자 예를 참조하세요.
$catdog.c #include <stdio.h> #include <문자열.h> 기본() { int i, len; char msg[] = "안녕하세요, 개.\n"; len = strlen(msg); i = 쓰기(17, 메시지, 길이); if (i == len) printf("성공! i = %d = len\n", i); 그렇지 않은 경우 (i == -1) { printf("오류! i = %d (len = %d)\n", i, len); 실수(""); } 기타 printf("예기치 않은 결과: i = %d, len = %d\n", i, len); } $ 개를 만드세요 cc 개.c -o 개 $ ./개과 실수! 나는 = -1 (len = 12) 잘못된 파일 설명자 $ ./canine 17> 동물 성공! 나는 = 12 = 길이 $ls -l 총 70개 -rw-r--r-- 1내 사용자 이름 내 그룹 이름 2012년 4월 12일 13:36 동물 -rwxr-xr-x 1내 사용자 이름 내 그룹 이름67067 4월 12일 13:36 개 -rw-r--r-- 1내 사용자 이름 내 그룹 이름 358 4월 12일 13:36 dog.c $ 고양이 동물 안녕, 개.
경고: 위 내용이 모든 쉘의 모든 버전에 적용되는지 확실하지 않습니다.
표준 프로그램은 2보다 높은 파일 설명자에 쓰지 않습니다(파일 열기, 네트워크 연결 설정 또는 유사한 작업을 통해 커널에서 파일 설명자를 얻지 않는 한). 그러나 이를 수행하는 (비표준) 프로그램이 있는 경우 이러한 파일 설명자를 리디렉션할 수 있습니다.
그리고 파일 설명자가 100개만 있고 각 파일 설명자가 리디렉션되는지 여부만 고려한다면 10억(1,000,000,000,000,000,000,000,000,000,000)개 이상의 가능한 조합이 있습니다.