STDIN이 내 선택 목록을 깨뜨립니다.

STDIN이 내 선택 목록을 깨뜨립니다.

선택적으로 STDIN에 대한 일부 입력을 받은 다음 사용자에게 선택 항목 목록을 제공하는 스크립트가 있습니다. STDIN에 데이터를 입력하면 선택 목록이 표시되지만 입력을 허용하지 않고 종료되지만 stdin을 통해 아무것도 제공되지 않으면 제대로 작동합니다.

간단한 예가 있습니다.

#!/usr/bin/env bash

if [[ -p /dev/stdin && ${#bar[@]} -eq 0 ]]; then
    while IFS= read -r foo; do
        bar+=("$foo")
    done </dev/stdin
fi

for foo in "${bar[@]}"; do
    echo "$foo"
done

select thing in foo bar baz; do
    case $thing in
        *)  echo "You have selected $thing"; break;;
    esac
done

표준 입력을 사용하지 않고 실행:

$ ./script.sh
1) foo
2) bar
3) baz
#? 2
You have selected bar

표준 입력을 사용하여 실행합니다.

$ printf '%s\n' foo bar | ./script.sh
foo
bar
1) foo
2) bar
3) baz
#?
$

왜 이런 일이 발생하고 이를 방지하는 방법을 아는 사람이 있습니까?

답변1

당신은 모든 것을 "소진"했습니다표준 입력실행 되면 select상태 1이 반환되고 아무것도 선택되지 않습니다.

아마도 당신은 독서를 통해 상호 작용을 강요하고 싶습니까 /dev/tty?

#!/usr/bin/env bash
if [ ! -t 0 ]; then
    while IFS= read -r foo; do
        bar+=("$foo")
    done
fi

for foo in "${bar[@]}"; do
    echo "$foo"
done

select thing in foo bar baz; do
    case $thing in
        *)  echo "You have selected $thing"; break;;
    esac
done </dev/tty

관련 정보