Я хочу направить вывод одного скрипта в другой скрипт, который будет обрабатывать вывод первого скрипта независимо? - PullRequest
0 голосов
/ 08 июля 2019

У меня есть очень тривиальный bash-скрипт, принимающий ввод от пользователя на первом этапе и затем выводящий вывод. Я хочу запустить один и тот же сценарий в разных оболочках, и пусть первая оболочка принимает входные данные, выводит его вывод и отправляет его на вход другой оболочки, и после этого обе оболочки продолжают нормально работать.

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

Это первый скрипт:

answer="n"
while [ "$answer" != 'y' ];do
    echo "enter the first value :"
    read first
    echo "the output is: "
    echo 6
    echo "enter value of A:"
    read  A
    echo "do you want to exit"
    read answer
done

Второй скрипт такой же:

answer="n"
while [ "$answer" != 'y' ];do
    echo "enter the first value :"
    read first
    echo "the output is: "
    echo 6
    echo "enter value of A:"
    read  A
    echo "do you want to exit"
    read answer
done

Я хочу, чтобы первый скрипт, запущенный на первом терминале, вывел число 6, а затем передал номер во второй скрипт, который должен быть помещен в переменную first, а затем позволил двум скриптам продолжить выполнение на своих соответствующих терминалах. .

1 Ответ

1 голос
/ 09 июля 2019

Именованный канал - подходящий инструмент. Таким образом, в первом скрипте:

#!/usr/bin/env bash
my_fifo=~/.my_ipc_fifo
mkfifo "$my_fifo" || exit
exec {out_to_fifo}>"$my_fifo" || exit

answer="n"
while [ "$answer" != 'y' ];do
    echo "enter the first value :"
    read first
    echo "the output is: "
    echo 6                          # one copy for the user
    printf '%s\0' 6 >&$out_to_fifo  # one copy for the other program
    echo "enter value of A:"
    read  A
    printf '%s\0' "$A" >&$out_to_fifo
    echo "do you want to exit"
    read answer
done

... а во втором:

#!/usr/bin/env bash
my_fifo=~/.my_ipc_fifo
exec {in_from_fifo}<"$my_fifo" || exit  # note that the first one needs to be started first!

while IFS= read -r -d '' first <&"$in_from_fifo"; do
  echo "Read an input value from the other program of: $first"
  read -r -d '' second <&"$in_from_fifo"
  echo "Read another value of: $second"
  read -p "Asking the user, not the FIFO: Do you want to exit? " exit_answer
  case $exit_answer in [Yy]*) exit;; esac
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...