Перенаправление на скрипт, использующий / dev / tty - PullRequest
3 голосов
/ 30 мая 2020

Я пишу ловушку git, которая может потребовать человеческого ввода. Согласно этот ответ нужно использовать exec < /dev/tty в этом скрипте. Это выполняет свою работу, но теперь нет возможности перенаправить стандартный вывод на эту ловушку (в целях тестирования). Думаю, проблему можно сузить до вопроса: как отправить сообщение на /dev/tty таким образом, чтобы его прочитал другой процесс? Не уверен, что это вообще возможно.

Вот минимальный воспроизводимый пример:

# file: target.sh

exec < /dev/tty # we want to use /dev/tty
read -p  "Type a message: " message
echo "The message ${message}"

Я пробовал несколько таких решений:

echo -e "foo\n"| tee /dev/tty | source target.sh

И он действительно печатает сообщение в консоли после приглашения read, но переменная message остается неустановленной. Есть ли способ исправить?

Ответы [ 2 ]

2 голосов
/ 30 мая 2020

Вы можете сделать входной файл необязательным параметром:

#!/bin/bash

input_file=${1:-/dev/tty}
read -p  "Type a message: " message < "${input_file}"
echo "The message ${message}"

# other stuff ...

Теперь проверьте команду следующим образом:

your_script
your_script <(echo foo)
some_cmd | your_script
some_cmd | your_script <(echo foo)

PS: Синтаксис <(echo foo), который я использую это так называемая замена процесса .

1 голос
/ 30 мая 2020

Вы можете использовать expect для достижения результата:

#!/bin/bash

expect << EOF
spawn bash target.sh
expect {
    "Type a message: " {send "foo\r"; interact}
}
EOF
...