Подтвердить что ты не робот

Обнаружить наличие содержимого stdin в оболочке script

Я пишу оболочку POSIX script, которая может или не может принимать входные данные из stdin (как в foo.sh < test.txt, не интерактивно). Как проверить, есть ли что-либо на stdin, чтобы не останавливаться на while read -r line...?

4b9b3361

Ответ 1

Если я правильно задаю вопрос, вы можете попробовать следующее:

#!/bin/sh
if [ -t 0 ]; then
    echo running interactivelly
else
    while read -r line ; do
        echo $line
    done
fi

Ответ 2

Чтобы ответить на вопрос буквально (но не то, что вы действительно хотите): read -t 0

Время ожидания, ноль секунд.

  • Это условие гонки, в зависимости от того, когда левая сторона готова предоставить данные. Вы можете указать -t 5, но в системе разбивки даже это проблематично.
  • read -t не стандартизирован в SUSv3. Он находится в BSD sh, bash, zsh. Это не в ksh или тире.

Таким образом, вы не можете просто использовать #!/bin/sh и ожидать этого.

Основная проблема заключается в том, что даже если ничего нет на stdin сейчас, это не значит, что скоро не будет. Вызов программы обычно приводит к тому, что stdin подключается к терминалу/независимо, поэтому нет способа сообщить, что нужно.

Итак, чтобы ответить на ваш вопрос буквально, вы можете это сделать, но на практике ваши варианты:

  • test, если stdin - tty: [ -t 0 ]
  • использовать argv для управления поведением

Ответ 3

Вы можете легко реализовать аналогичное поведение, как команда "cat", которая считывается из списка предоставленных файлов или если они не предоставляются, а затем читать из stdin.

Хотя вы не можете использовать эту идею, я думаю, что эта статья в Linux Journal будет вам интересна http://www.linuxjournal.com/content/determine-if-shell-input-coming-terminal-or-pipe

: -)

Ответ 4

Если вы никогда не хотите запускать script в интерактивном режиме, заставьте его использовать входной файл как параметр, а не использовать stdin. Некоторые программы используют флаг или специальное имя файла, чтобы указать, что они должны принимать входные данные от стандартного ввода, а не из файла; этот случай позволяет обрабатывать командную строку при необходимости.

Если вы хотите, чтобы ваш script принял стандартный ввод, почему бы вам не позволить ему быть интерактивным (или, по крайней мере, вести себя как другие инструменты POSIX)?