Linux에서 파일을 참조할 수 있는 **출력** 유형이 4가지라는 결론이 사실입니까?

Linux에서 파일을 참조할 수 있는 **출력** 유형이 4가지라는 결론이 사실입니까?

4가지 유형이 있다고 결론을 내리는 것이 사실입니까?스트림 출력명령을 실행한 후 CLI에 해당 파일이 표시되는 것을 원하지 않으면 Linux에서 파일을 참조할 수 있습니까?

파일에 대한 가능한 참조:

  1. 모든 스트림 출력
  2. 표준 오류만
  3. stdout만 해당됩니다(stdout의 최종 결과 포함).
  4. stdout 및 stderr(stdout의 최종 결과 제외)

노트:

숫자 4의 예는 다음과 같습니다 find / -type f -name php.ini 2>/dev/null. 내가 이해하는 바에 따르면, 이 명령을 사용하면 stderr이나 stdout이 생성되지 않습니다.stdout의 최종 결과이 경우에는 우리가 검색한 파일입니다(발견된 경우).

답변1

Unix 시스템의 각 프로세스에는 두 개의 출력 스트림이 연결되어 있습니다.표준 출력(stdout, 파일 설명자 1) 및표준 에러(stderr, 파일 설명자 2). 이들은 서로 독립적으로 리디렉션될 수 있습니다.표준 입력파일 설명자 0을 사용합니다.

  • 표준 출력을 파일로 리디렉션하려면 또는 보다 명시 file적인 . 데이터를 삭제하려면 다음 으로 바꾸세요 .>file1>filefile/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, stdoutstderr.

기본적으로 셸(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보다 높은 파일 설명자를 리디렉션하는 방법은 다음 위치에서 설명됩니다.file1file2

예를 들어, 높은 파일 설명자의 다음 예를 참조하세요.

$ 고양이 canine.c
#include <stdio.h>
#include <문자열.h>

기본()
{
        int i, len;
        char msg[] = "안녕하세요, 개.\n";

        len = strlen(msg);
        i = 쓰기(17, 메시지, len);
        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내사용자 이름 내 그룹 이름    4월 12일 13시 36분 동물
-rwxr-xr-x 1내사용자 이름 내 그룹 이름67067 4월 12일 13:36 송곳니
-rw-r--r-- 1내사용자 이름 내 그룹 이름   358 4월 12일 13:36 canine.c

$ 고양이 동물
안녕, 개.

경고: 위의 내용이 모든 쉘의 모든 버전에서 작동하는지 확신할 수 없습니다.

표준 프로그램은 2보다 높은 파일 설명자에 쓰지 않습니다(파일 열기, 네트워크 연결 설정 등을 통해 커널에서 해당 파일 설명자를 얻지 않는 한). 그러나 이를 수행하는 (비표준) 프로그램이 있는 경우 해당 파일 설명자를 리디렉션할 수 있습니다.

그리고 파일 설명자가 100개에 불과하고 각 설명자가 리디렉션되는지 여부만 고려한다면 100만 개가 넘는 가능한 조합이 있습니다.

관련 정보