내 Bash 스크립트의 strace 출력에서 ​​"장치에 적합하지 않은 ioctl"을 제거해야 합니까?

내 Bash 스크립트의 strace 출력에서 ​​"장치에 적합하지 않은 ioctl"을 제거해야 합니까?

나는 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이 함수가 모든 라인에서 호출된다는 것이 놀랍지 않나요? -uBash의 주장이 관련성이 있을 수 있다는 생각이 들었습니다 .

-u fd  Read input from file descriptor fd.

몇 가지 실험을 했지만 성공하지 못했습니다. 따라서 이 옵션을 사용하는 방법은 또 다른 질문일 수 있습니다.

저는 Bash 버전 4.3.48(1)과 함께 Ubuntu 16.04를 사용하고 있습니다.

답변1

제거할 수도 없고 삭제할 이유도 없습니다. 이는 입력이 터미널에서 오는지 확인하는 bash에서 비롯됩니다(호출함).isatty). 실제로 다양한 옵션을 전달할 때만 이 정보를 사용하지 않습니다. 자세한 내용이 궁금하다면 소스코드( read_builtin의 함수 builtins/read.def)를 읽어보세요.

TCGETSioctl이 반환된다는 사실 ENOTTY은 애플리케이션이 입력이 터미널이 아니라는 것을 알 수 있는 방법입니다. 이것은 예상됩니다. 함수가 오류 상태를 반환한다고 해서 문제가 발생했다는 의미는 아닙니다.

관련 정보