명령줄에서 입력을 받는 함수가 있습니다.선택적으로, 표준 입력에서. 그러나 입력 스트림이 지정되지 않으면 입력을 중지합니다.
#!/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
아마도 보류 중인 명령 끝에 추가하는 경우일 것입니다 .
이는 표준 입력을 방해하지 않고 명령을 진행할 수 있도록 명령에 대한 가상 입력을 제공합니다.