프로그램 출력 리디렉션


11

"일부 숫자보다 큼"구문 (예 :)으로 프로그램 출력을 리디렉션하려고 할 때 foo 2> myfile여기에 가능한 숫자는 무엇이며 무엇을 나타내는가?

나는 1 /dev/stdout, 2는 믿습니다 /dev/stderr. 5와 6은 어떻습니까? 3, 4 또는 6보다 큰 숫자가 있습니까?


답변:


11

이 가정 프로그램은 지정한 파일 설명자 번호에 씁니다. 다음 hello world 프로그램을 고려하십시오.

#include <stdio.h>

main()
{
   ssize_t i = 0 ;
   printf ("hello world\n") ;
   i = write( 5 , "Bonjour Monde\n", 14 ) ;
   printf ("%d octet dans 5\n", (int) i) ;
}

그것을 컴파일

me@mybox:~/tmp7$ make hw
cc     hw.c   -o hw

이제 간단한 실행

me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5

5에 대한 파일이 없으므로 쓴 바이트가 없습니다.

다음 시도 :

me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde

파일과 파일 설명자를 지정하는 동안 출력을 얻을 수 있습니다 (예 :) 5>u.

실제로 위와 같은 재미있는 프로그램을 작성하지 않은 경우을 사용하여 데이터를 수집 할 가능성이 없습니다 5>foo.

쉘 스크립트에서 <()를 사용하는 구문이 더 유용합니다.

 diff <( cmd -par 1 ) <(cmd -par 2)

write()ssize_t아닌을 반환합니다 int.
Andrew Henle

그것은 문제의 요점이 아니며 printf 함수에 대한 반환도 있습니다.
Archemar

반환 된 값을 사용하지 않는 것은 잘못된 유형을 사용하는 것과 크게 다릅니다 .
Andrew Henle

편집 출력에 변화가없는 것을 본다 ...
Archemar

10

숫자는 파일 디스크립터 (열린 파일에 대한 처리)를 나타냅니다.

쉘은 보통 자동으로 3을 설정합니다.

0-stdin 1-stdout 2-stderr

그러나 추가 파일을 열면 숫자가 증가합니다.


7

이 숫자는 파일 설명자 입니다. 언급했듯이 자동으로 생성되는 것이 몇 가지 있습니다. 다른 파일이나 파일과 같은 것들이 열리면 다른 숫자를 얻습니다.

특정 프로그램에서 사용되는 숫자는 해당 프로그램에서 열거 나 사용 된 파일에 따라 다릅니다. 예를 들어, 현재 stdin을 "저장"하고 stdin을 다른 곳에서 일시적으로 리디렉션 한 후 나중에 복원하려면 다음과 같이 할 수 있습니다.

exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate

따라서이 스크립트는 4최소한 한동안 파일 디스크립터를 사용할 수 있습니다. 그 4는 사용하지 않는 것이 될 수 있습니다.

프로세스에서 어떤 파일 디스크립터를 열 었는지, 그리고 어디에서 파일 디스크립터를 열 었는지 확인할 수 있습니다 /proc/<pid>/fd. 해당 프로세스에 대해 열려있는 모든 파일 디스크립터 <pid>와 해당 파일과 연관된 파일이 표시됩니다.


0

모든 프로세스는 정수를 파일 디스크립터로 가져옵니다. POSIX에는 3 개의 예약 된 프로세스가 있습니다. 0은 stdin, 1은 stdout, 2는 stderr입니다. 추가 파일에는 추가 번호가 할당됩니다. 이 프로그램으로 쉽게 확인할 수 있고 fdtest.c 로 저장하여 런타임 중에 자체 프로그램 코드를 열 수 있습니다.

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd = open("fdtest.c", O_RDONLY);
    printf("%d\n", fd);
    close(fd);
    return 0;
}

그것을 컴파일하십시오 :

gcc fdtest.c -o fdtest

그것을 실행 :

./fdtest

얻을 수있는 출력은 다음과 같습니다.

3

... 변수에 의해 참조되는 파일의 파일 디스크립터 번호입니다 fd.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.