Перенаправление ввода в скрипт, работающий в фоновом режиме - PullRequest
0 голосов
/ 05 сентября 2018

Я написал скрипт для изменения размеров окон, который требует ориентации и значения в виде дроби, например:

resize.sh -h 1/2

и работает как положено. Я также добавил флаг -k, что означает, что скрипт требует ввода данных пользователем, например:

resize.sh -k -h

и в сценарии:

read -rsn 2 fraction

, который я анализирую, чтобы получить значения для числителя и знаменателя.

Это прекрасно работает из командной строки, но идея заключается в том, чтобы связать resize.sh -k -h с некоторой комбинацией клавиш и передать следующие две клавиши в качестве ввода. Но когда я запускаю скрипт с клавиатуры, он запускается как фоновый процесс, который не связан ни с одним tty, поэтому read не может получить свой ввод. Есть ли способ перенаправить глобальный ввод в фоновый процесс после запуска его с клавиатуры.

Что я пробовал до сих пор:

  • Перенаправление в / proc / $$ / fd / 0, которое не сработало.

  • Redirectiong в настоящее время активный tty stdin для чтения, например так:
    read -rsn 2 fraction < /dev/pts/0

, который действительно работал, но проблема в том, что не все окна являются терминальными, например веб-браузер.

Если мой вопрос неясен, пожалуйста, не стесняйтесь спрашивать дополнительные разъяснения или детали, и заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

спасибо вам обоим за предоставление очень полезной информации. Решение - это комбинация обоих, на самом деле.

Сначала я изменил команду чтения в resize.sh, чтобы получить входные данные из именованного канала, как предложил Уолтер, затем я написал новый, своего рода «обертку» скрипт, который выполняет resize.sh в фоновом режиме, а затем, так как Бармар указал, что я нужно окно графического интерфейса, оно запускает очень маленькое окно терминала, в котором выполняется чтение и передача ввода в именованный канал. Более того, используя wmctrl, мне удается разместить небольшое окно терминала прямо там, где начинается текущее активное окно, и спрятать его ниже (благодаря свойствам openbox для каждого приложения), так что оно технически вообще не видно:)

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

0 голосов
/ 05 сентября 2018

Вы можете использовать именованный канал для связи процесса. Я сделал пример сценария, где фоновый процесс является функцией.

#!/bin/bash
pipe_name=/tmp/mypipe$$
mkfifo "${pipe_name}"

resize()
{
   read fraction < "${pipe_name}"
   echo "Resize window to fraction=${fraction}"
}

resize &
read -p "Enter your fraction: "
echo "${REPLY}" > "${pipe_name}"

rm "${pipe_name}"
...