선택적으로 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