Bash - 표준 입력에 아무것도 포함되어 있는지 확인

Bash - 표준 입력에 아무것도 포함되어 있는지 확인

나는 이 질문을 여러 번 받았지만 나에게는 도움이 되지 않는 것 같습니다.

[[ ! -t 0 ]]= 표준 입력에 어떤 내용이 포함되어 있습니까?

이 명령은 다음과 같습니다.

echo 'Hello world' | [[ ! -t 0 ]]
echo $?

올바른 출력을 제공합니다: 0즉, 표준 입력에는 무엇이든 포함됩니다.
이 명령은 다음과 같습니다.

[[ ! -t 0 ]]
echo $?

올바른 출력을 제공합니다: 1즉, 표준 입력이 비어 있습니다.
대신 다음 명령을 사용하세요.

: | [[ ! -t 0 ]]
echo $?

예상치 못한 출력을 제공합니다: 0, 표준 입력은 비어 있습니다: 1.

왜 이런 일이 발생합니까? 이 문제를 어떻게 해결할 수 있나요?

답변1

[[ ! -t 0 ]]= 표준 입력에 어떤 내용이 포함되어 있습니까?

당신의 전제가 잘못되었습니다. 이 테스트를 수행합니까?표준 입력대신 터미널/tty에 연결할지 여부표준 입력무엇이든 포함됩니다. 부정으로 인해 다음 조건이 true인 경우 명령은 0(true)을 반환합니다.표준 입력터미널에 연결되지 않았습니다.

바라보다 man test:

-t FDFD터미널에서 열린 파일 설명자

그리고 man bash:

-t fd파일 설명자가 fd열려 있고 터미널을 참조하는 경우 참입니다.

이를 염두에 두고 예제를 다시 평가하면 예상된 종료 상태를 반환하는 것을 볼 수 있습니다.

보류 중인 항목이 있는지 확인하는 올바른 방법표준 입력을 사용 select(2)하지만 이는 쉘에서 직접 사용할 수 없습니다(예: ) bash. 내가 제안할 수 있는 가장 가까운 방법은 read즉각적인 시간 초과를 사용하는 것입니다.

sleep 2
if read -t 0 _
then
    echo "Ready to receive data"
    IFS= read -r data
    echo "Received: $data"
fi

실행한 다음 초기화 중에 sleep(a) 사전 로드를 시도합니다.표준 입력일부 텍스트의 경우 (b)는 아무 작업도 수행하지 않습니다.

read -t 0 _파이프에서 읽는 중이고 작성기가 없으면 이 작업은 여전히 ​​(맨 위에서) 중단됩니다. 작성자가 있으면 작성자가 읽을 내용을 작성하지 않은 경우에도 설명된 대로 작동합니다.

관련 정보