IO(docker)를 차단하지 않고 stdin에 데이터가 있는지 확인하는 방법은 무엇입니까?

IO(docker)를 차단하지 않고 stdin에 데이터가 있는지 확인하는 방법은 무엇입니까?

을 실행하면 을 echo this | docker run -i alpine cat얻습니다 this.
을 실행하면 stdin을 읽었 docker run -i alpine cat기 때문에 터미널이 차단되지만 cat거기에는 아무것도 없습니다.

열린 파일 설명자를 확인할 수 있습니다. 을 실행하면 docker run -i alpine ls -lA /proc/1/fd표준 출력에 다음이 표시됩니다.

lr-x------    1 root     root            64 Aug  9 13:45 0 -> pipe:[10289389]
l-wx------    1 root     root            64 Aug  9 13:45 1 -> pipe:[10289390]
l-wx------    1 root     root            64 Aug  9 13:45 2 -> pipe:[10289391]
lr-x------    1 root     root            64 Aug  9 13:45 3

이것은 표준 오류입니다.

ls: /proc/1/fd/3: cannot read link: No such file or directory

모든 것이 echo this | docker run -i alpine ls -lA /proc/1/fd동일합니다( 제외 pipe:[these numbers]).

-i에서 제거 하지 않으면 docker runIO 블록 없이 stdin에 데이터가 있는지 확인할 수 있는 방법이 있습니까? test -t 0stdin fd가 항상 열려 있기 때문에 전혀 작동하지 않습니다.


stdin에서 읽고 stdout으로 출력하는 CLI 명령을 만들고 싶습니다 docker run mycommand(stdout은 간단하고 흥미롭지 않습니다). 그래서 echo data | docker run mycommand입력 데이터를 기반으로 다른 내용을 인쇄하고 싶습니다. 하지만 이 docker run mycommand작업을 수행하려면 "표준 입력에 데이터를 제공해야 합니다"라고 표시되어야 합니다.

답변1

예, 읽을 데이터가 있는지 여부를 셸에서 확인할 수 있습니다. 나는 쉘 입력 읽기에 관한 많은 정보를 보관하고 있습니다.

https://antofthy.gitlab.io/info/shell/input_reading.txt

너의 문제..."IO 블록을 요구하지 않고 stdin에 데이터가 있는지 확인할 수 있는 방법이 있습니까?"

기본적으로 "설문 조사"(읽기 없음) 테스트를 요구하고 있습니다.

read -r -t 0 var

이것은 실제로 아무것도 읽지 않습니다. 읽을 내용이 있으면 종료 상태는 0(true)이고, 아무것도 없으면 1을 반환하고, EOF는 false를 반환합니다.

또한 이는 데이터가 사용 가능한지 여부만 알려줍니다. 읽기를 시도할 때까지 입력이 "파일 끝"(EOF)에 있는지 알려주지 않습니다. 또한 입력이 완전한 줄(개행 포함)인지 여부도 알려주지 않습니다.

차단하지 않고 사용 가능한 데이터를 읽으려면...

  read -r -t 0.00001 line

대부분의 경우 전체 줄을 읽고 일반적으로 줄 바꿈이나 EOF를 얻을 때까지 입력을 차단한다는 점을 명심하세요. 개행 문자를 사용할 수 없는 경우 위 코드는 오류 종료 142와 빈 줄을 반환합니다. 이는 불완전한 줄 뒤에 EOF가 오는 경우에도 마찬가지입니다.

줄바꿈을 사용할 수 있는 경우에도 모든 데이터를 읽으려면(모든 줄바꿈이 포함됩니다)...

  while IFS= read -r -s -d '' -t .01 data
  do [ $? -ge 128 ] && break
    printf "$data"
  done

읽기에 -n1을 추가하면 한 번에 한 문자씩 읽습니다!

원하는 것이 무엇인지 알아보려면 위 문서의 다양한 섹션을 읽어 보시기 바랍니다. 다른 프로그래밍 언어의 특징과 마찬가지로 이 모든 것이 이 언어에도 동일하게 적용됩니다.

추가의

나열된 파일 설명자가 셸에서 읽거나 쓸 준비가 되었는지 확인할 수 있는 "shell_select"라는 내가 작성한 Perl 스크립트를 확인해 보세요!

https://antofthy.gitlab.io/software/#shell_select

나는 이를 사용하여 입력을 완전히 독립적으로 유지하면서 하나의 파일 핸들 또는 다른 파일 핸들에 매달리지 않고(차단) 여러 입력 스트림(원래 "bc" 수학 계산기의 stdout 및 stderr)을 처리합니다.

관련 정보