나는 이 질문을 여러 번 받았지만 나에게는 도움이 되지 않는 것 같습니다.
[[ ! -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 FD
FD
터미널에서 열린 파일 설명자
그리고 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 _
파이프에서 읽는 중이고 작성기가 없으면 이 작업은 여전히 (맨 위에서) 중단됩니다. 작성자가 있으면 작성자가 읽을 내용을 작성하지 않은 경우에도 설명된 대로 작동합니다.