나는 strace
이 코드를 사용하고 있습니다 :
#!/usr/bin/env bash
exec 0<test.log
while IFS= read -r line; do
printf "%s\n" "$line"
done
(직접 <test.log
리디렉션해도 동일한 결과가 나타납니다.)
모든 줄을 읽을 때마다 이 오류가 발생합니다.
ioctl(0, TCGETS, 0x7fff1e645d50) = -1 ENOTTY (Inappropriate ioctl for device)
조사를 좀 해보니이것가장 가까운 답변입니다. 그러나 그것은 정확하지 않습니다. 내 스크립트는 잘 실행됩니다. 이것이 제가 처리해야 할 문제인지 아니면 Bash를 사용하여 이 작업을 수행하는 표준 방법인지 궁금합니다. ioctl
이 함수가 모든 라인에서 호출된다는 것이 놀랍지 않나요? -u
Bash의 주장이 관련성이 있을 수 있다는 생각이 들었습니다 .
-u fd Read input from file descriptor fd.
몇 가지 실험을 했지만 성공하지 못했습니다. 따라서 이 옵션을 사용하는 방법은 또 다른 질문일 수 있습니다.
저는 Bash 버전 4.3.48(1)과 함께 Ubuntu 16.04를 사용하고 있습니다.
답변1
제거할 수도 없고 삭제할 이유도 없습니다. 이는 입력이 터미널에서 오는지 확인하는 bash에서 비롯됩니다(호출함).isatty
). 실제로 다양한 옵션을 전달할 때만 이 정보를 사용하지 않습니다. 자세한 내용이 궁금하다면 소스코드( read_builtin
의 함수 builtins/read.def
)를 읽어보세요.
TCGETS
ioctl이 반환된다는 사실 ENOTTY
은 애플리케이션이 입력이 터미널이 아니라는 것을 알 수 있는 방법입니다. 이것은 예상됩니다. 함수가 오류 상태를 반환한다고 해서 문제가 발생했다는 의미는 아닙니다.