Приостановить выполнение сценария bash после цикла read (stdin)

Я делаю сценарий, который принимает данные через канал (stdin), как в (other_command | my_script). Однако мне нужно приостановить выполнение сценария и подождать, пока пользователь нажмет ввод, после того как я прочел весь стандартный ввод.

Вот пример сценария.

#!/bin/bash

if [[ -t 0 ]]; then
  echo "No stdin"
else
  echo "Got stdin"
  while read input; do
    echo $input
  done
fi

echo "Press enter to exit"
read

И это работает так;

$ echo text | ./script
Got stdin
text
Press enter to exit
$

Он перепрыгивает через мой последний read.

Однако

$ ./script
No stdin
Press enter to exit
stops here
$

Как я могу заставить read работать после того, как я прочитал из stdin? И есть ли решение, которое будет работать как на Linux, так и на OSX?

4 голоса | спросил xeor 21 SunEurope/Moscow2014-12-21T02:42:24+03:00Europe/Moscow12bEurope/MoscowSun, 21 Dec 2014 02:42:24 +0300 2014, 02:42:24

1 ответ


0

Вы хотите читать от пользователя. Если stdin не пользователь, вы должны читать откуда-то еще. Типичным выбором является токовый терминал (здесь терминал подключен к stderr, если он есть).

read -p "Press enter" < "$(tty 0>&2)"

По умолчанию tty находит имя tty на stdin, которое, очевидно, не будет работать, когда stdin является конвейером. Поэтому мы перенаправляем его, чтобы он смотрел на stderr.

ответил that other guy 21 SunEurope/Moscow2014-12-21T02:48:08+03:00Europe/Moscow12bEurope/MoscowSun, 21 Dec 2014 02:48:08 +0300 2014, 02:48:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132