표준 입력에서 입력이 없을 때 입력을 중지하는 "읽기" 명령을 피하세요.

표준 입력에서 입력이 없을 때 입력을 중지하는 "읽기" 명령을 피하세요.

명령줄에서 입력을 받는 함수가 있습니다.선택적으로, 표준 입력에서. 그러나 입력 스트림이 지정되지 않으면 입력을 중지합니다.

#!/bin/bash
somefunc() {
  # output strings on command line.
  while (($#)); do
    echo "$1"
    shift
  done

  # take input from stdin, if it exists.
  declare line
  while read -sr line; do 
    echo "$line"
  done
}

somefunc "$@"

이것은 작동합니다:

$ somefunc "arg1" "arg2" "..." <"/some/file"

다음은 수행되지 않습니다.

$ somefunc "arg1" "arg2" "..." 

읽기 명령에 시간 초과(예: -t 0.0001)를 사용하여 이 문제를 해결할 수 있지만 이는 약간 어색하고 취약한 것 같습니다.

시간 초과를 사용하지 않고 이를 달성하는 더 좋은 방법이 있습니까?

답변1

-t를 사용하는 bash 내장 테스트는 작업을 훌륭하게 수행해야 합니다. [ -t 0 ] 이 링크에는 좋은 예가 있습니다.

입력이 매개변수, 파일 또는 터미널에서 오는지 감지하는 방법

답변2

두 가지 솔루션이 있으며 둘 다 똑같이 빠르고 서투르지 않습니다.

이것이 내가 선호하는 솔루션입니다.

  # take input from stdin, if it exists.
  if read -t 0; then
    declare line
    while read -sr line; do 
      echo "$line"
    done
  fi

[ -t 0 ] 도 작동합니다:

  # take input from stdin, if it exists.
  if [ -t 0 ]; then
    declare line
    while read -sr line; do 
      echo "$line"
    done
  fi

답변3

< /dev/null아마도 보류 중인 명령 끝에 추가하는 경우일 것입니다 .

이는 표준 입력을 방해하지 않고 명령을 진행할 수 있도록 명령에 대한 가상 입력을 제공합니다.

관련 정보