표준 입력에 대해서. `[n]의 예

표준 입력에 대해서. `[n]의 예

점은 무엇인가 1<filename? 어쩌면 "키보드 -> 표준 출력"을 의미할까요?

답변1

1<filenamefilename읽기 위해 파일을 열고 파일 설명자 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<&-

관련 정보