점은 무엇인가 1<filename
? 어쩌면 "키보드 -> 표준 출력"을 의미할까요?
답변1
1<filename
filename
읽기 위해 파일을 열고 파일 설명자 1에서 실행 중인 명령(또는 리디렉션을 사용하는 경우 전체 셸 프로세스)에서 해당 파일을 사용할 수 있도록 셸에 지시하는 리디렉션입니다 exec
. 이는 일반적으로 모든 리디렉션에 적용되기 때문입니다. <
입력 리디렉션을 표시하기 위해 선택적 선행 숫자는 파일 설명자 번호를 지정합니다.
이 리디렉션에서 특이한 점은 fd 1이 표준 출력 스트림용으로 예약되어 있으므로 프로그램은 일반적으로 여기에 쓸 수 있다고 가정한다는 것입니다. 입력 리디렉션을 통해 열리면 이 가정은 실패합니다.
$ touch filename
$ ls 1<filename
ls: write error: Bad file descriptor
입력을 위해 fd 2(stderr)를 열거나 입력을 위해 fd 0(stdin)을 열면 동일한 일이 발생합니다.산출.
$ cat 0> filename
cat: -: Bad file descriptor
물론 stderr에 쓸 수 없는 경우 오류 메시지가 표시되지 않습니다. 0이 아닌 가짜 종료 상태가 나타날 수 있습니다.
답변2
표준 출력에서 입력 파일을 열면 안 됩니다. ( exec
리디렉션하기 전에 작동하도록 해야 합니다. 그러나 여전히 실패하고 차단될 수 있습니다.) fd로 파일을 열려면 3 또는 무엇이든 사용하십시오.
exec 3<filename
# do something with fd 3
exec 3<&-
fd 0(stdin)으로 리디렉션하는 것이 가능하지만 fd 0이 다른 곳을 가리키는 경우 먼저 저장해야 합니다.
exec 3<&0
exec < filename
# do something with the file on fd 0
# restore stdin, free fd3
exec 0<&3 3<&-