프로그램 출력 리디렉션

프로그램 출력 리디렉션

예를 들어 "일부 숫자가 다음보다 큼" 구문을 사용하여 프로그램 출력을 리디렉션하려고 할 때 foo 2> myfile여기에 가능한 숫자는 무엇이며 이는 무엇을 나타냅니까?

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

답변1

이 가상 프로그램은 사용자가 지정한 파일 설명자에 기록합니다. 다음 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)

답변2

이 숫자는 파일 설명자(파일 열기 핸들)를 나타냅니다.

쉘은 일반적으로 자동으로 3을 설정합니다.

0 - 표준 입력 1 - 표준 출력 2 - 표준 오류

그러나 더 많은 파일을 열 수 있으며 그 수도 늘어납니다.

답변3

이 숫자는파일 설명자. 지적했듯이 여러 개가 자동으로 생성됩니다. 다른 파일이나 파일과 유사한 항목을 열면 다른 번호를 얻게 됩니다.

특정 프로그램에 사용되는 숫자는 프로그램이 열었거나 다른 방법으로 사용한 파일에 따라 다릅니다. 예를 들어, 현재 표준 입력을 "저장"하고 일시적으로 다른 곳에서 표준 입력을 리디렉션한 다음 나중에 복원하려면 다음을 수행할 수 있습니다.

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

4따라서 이 스크립트에는 적어도 잠시 동안 사용할 수 있는 파일 설명자가 있습니다 . 그러나 4는 사용되지 않은 파일일 수 있습니다(프로세스가 열 수 있는 파일 수에는 제한이 있지만 해당 제한 내의 모든 파일이 될 수 있습니다).

프로세스가 어떤 파일 설명자를 열었는지, 파일 설명자를 보면 어디에서 열려 있는지 확인할 수 있습니다 /proc/<pid>/fd. 여기에는 프로세스에 대해 열려 있는 모든 파일 설명자 <pid>와 이와 관련된 파일이 표시됩니다.

답변4

모든 프로세스는 파일 설명자로 정수를 가져오며 그 중 3개는 POSIX에 예약되어 있습니다. 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.

관련 정보