Тестирование для сценария, который ожидает на стандартном вводе

Есть ли способ определить, ожидает ли скрипт на стандартном вводе и вызвать команду для выхода, если обнаружен?

Вот пример, выполнение команды, которую я выполняю, занимает много времени, но она также будет запрашивать ввод перед запуском без приглашения. Я хочу знать, что команда на самом деле что-то делает, а не просто ждет.

При условии, что следующий скрипт называется./demo

#!/bin/bash

read

Есть ли способ обнаружить, что чтение ожидает на стандартный ввод? Что-то вроде

failifwaitingonstdin | ./demo

Который немедленно вернется, как только будет обнаружена команда чтения.

Обновлено:

Люди предложили программы, как ожидать и да. Пройдя через да, я вижу, как они могут поддерживать этот стиль взаимодействия. Они постоянно используют fputs для записи 'y' в стандартный вывод. Вместо того, чтобы делать это бесконечно, я могу просто вернуть ошибку, как только fputs вернёт запись в stdout.

4 ответа

Решение

Было бы очень полезно, если бы вы были более конкретны в своем сценарии и / или команде. Но в случае, если вы хотите проверить, откуда исходит stdin, этот пример сценария продемонстрирует это для вас:

#!/bin/bash
if [[ -p /dev/stdin ]]
then
    echo "stdin is coming from a pipe"
fi
if [[ -t 0 ]]
then
    echo "stdin is coming from the terminal"
fi
if [[ ! -t 0 && ! -p /dev/stdin ]]
then
    echo "stdin is redirected"
fi
read
echo "$REPLY"

Пример работает:

$ echo "hi" | ./demo
stdin is coming from a pipe
$ ./demo
[press ctrl-d]
stdin is coming from the terminal
$ ./demo < inputfile
stdin is redirected
$ ./demo <<< hello
stdin is redirected
$ ./demo <<EOF
goodbye
EOF
stdin is redirected

Если вы пишете сценарии: bash's read Встроенный принимает опцию тайм-аута:

read -p prompt -t 5 var # 5s timeout

Если нет, вы можете использовать expect, или просто yes, чтобы подделать взаимодействие с пользователем.

Если вы используете Linux, вы можете использовать strace чтобы увидеть, пытается ли процесс читать со стандартного ввода. Другие платформы имеют аналогичные программы (например, dtrace, ktrace, или же truss).

Вы могли бы вообще избежать этой проблемы, подавая вывод yes к рассматриваемой команде.

Не зная, что вы пытаетесь сделать, я бы поспорил, что вы должны писать сценарий, чтобы вы всегда знали, будет ли он запрашивать стандартный ввод или нет. Либо это, либо что-то в команду, которая, вероятно, хочет чего-то от stdin, но это, вероятно, не лучшая идея.

Другие вопросы по тегам