Shell Script: Фокус уже открытой вкладки терминала со второй вкладки терминала

это может показаться немного странным, но я пытаюсь сделать что-то немного сложнее:

Я пишу сценарий, который открывает новую вкладку с командами, я хотел бы вернуться к Первая вкладка после того, как пользователь вводит данные на дополнительную вкладку (тот факт, что эта вкладка фокусируется, является предполагаемым поведением и наиболее важным):

echo "new tab is about to open..."
gnome-terminal --tab --active --title="install dependencies..." -- bash -c 'echo "hello";
#other commands;
read user_input;
#now I want to switch back to first tab while this tab works in the backgroud;
command;
command;
command;
command;
command;
command;
command;'

echo "hello welcome back to the correct tab, we have been waiting for you! :)"
read new_user_input;

такая возможность возможна?

У меня было эта идея, потому что аргумент --active вызывает нечто, что фокусирует новую вкладку (и даже работает, если вкладка, вызывающая это, не активна). поэтому что-то от природы должно быть возможным.

6
задан 19 April 2019 в 14:23

4 ответа

Вы можете попробовать симулировать нажатия клавиш, чтобы перейти на другую вкладку:

Вы можете использовать xdotool для имитации любой комбинации нажатий клавиш. Чтобы изменить вкладку в gnome-терминале, используйте Ctrl + Page_Up (вернитесь на одну вкладку назад). Поэтому xdotool key --clearmodifiers Ctrl+Page_Up изменится на вашу старую вкладку.

Чтобы убедиться, что в центре этого нажатия клавиши находится терминал, который я использовал wmctrl, его можно использовать следующим образом: wmctrl -a "install dependencies".

Таким образом, команда для переключения на предыдущую вкладку будет:

wmctrl -a "install dependencies" && xdotool key --clearmodifiers Ctrl+Page_Up

Вы можете установить эти инструменты, используя sudo apt-get install wmctrl xdotool

0
ответ дан 19 April 2019 в 14:23

Ручной метод

В соответствии с этим Q & A: Существует ли горячая клавиша для переключения между вкладками в приложении терминала по умолчанию?

После открытия новой вкладки вы можно вернуться на предыдущую вкладку с помощью Ctrl + pg up

Автоматический метод в скрипте

Для отправки сигнала в Bash Shell (gnome-терминал) используйте xdotool:

sudo apt install xdotool

В вашем скрипте введите следующую команду:

xdotool key Control+Page_Up

Я только что закончил установку и тестирование на Ubuntu 16.04 LTS, и это работает в совершенстве. Он должен работать на всех десктопах X11.


Более традиционный метод

OP требует поддержки Wayland и, что более важно, метода POSIX, который работает со многими * NIX-дистрибутивами.

Из этого Q & A:

... команда:

gnome-terminal -e 'bash -c "sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade; exec bash"'

Мы изменим пример команды, чтобы она выглядела следующим образом:

gnome-terminal -e 'bash -c "second-script.sh; exec bash"'

Вот как second-script.sh выглядит:

#!/bin/bash

# AU question: https://askubuntu.com/questions/1134625/shell-script-focus-already-open-terminal-tab-from-second-terminal-tab/1135206#1135209

echo "Welcome to the second script."
echo " Run command 1."
sleep 1
echo " Run command 2."
sleep 1
read -n 1 -s -r -p "Press any key to continue"

touch /tmp/second-script-user-ack # signal parent to continue commands there
echo " Run command 3."
sleep 5
echo " Run command 4."
sleep 5

# Now terminates.
exit 0

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

chmod a+x second-script.sh

Примечание: Это открывает второе окно терминала, которое остается открытым, пока пользователь не закроет его. Это можно изменить на автоматическое закрытие.

Наш первый (родительский) скрипт будет выглядеть следующим образом:

#!/bin/bash

# AU question: https://askubuntu.com/questions/1134625/shell-script-focus-already-open-terminal-tab-from-second-terminal-tab/1135206#1135209

file=/tmp/second-script-user-ack
if [ -f $file ] ; then
    rm $file
fi

window=$(xdotool getactivewindow)
# Launch second script running in background, don't wait
gnome-terminal -e 'bash -c "second-script.sh; exec bash"' &&

while true ; do
    if [ -f $file ] ; then
        break
    fi
done

xdotool windowactivate $window

echo "Child still running. Ready to run extra Parent Commands"
read -n 1 -s -r -p "Press any key to continue"
echo
echo " Parent Command 1."
sleep 5
echo " Parent Command 2."
sleep 5

echo "Parent program completed"
read -n 1 -s -r -p "Press any key to continue"

exit 0

Преимущества текущего подхода:

  • Вы можете видеть, что оба окна работают одновременно. Со второй вкладкой вы не можете видеть оба скрипта.
  • После завершения дочернего процесса (second-script.sh) вывод остается видимым до закрытия окна.

Инструменты Wayland

Существует не так много инструментов Wayland для управления активными окнами.

Я нашел это: ydotool , но вам нужно будет скомпилировать его вручную. Установочного пакета Debian / Ubuntu не существует. Есть установочный пакет Arch Linux, который могут использовать некоторые из ваших пользователей.

0
ответ дан 19 April 2019 в 14:23

Ну, это занимает больше времени, чем я ожидал. Наконец-то мне удается получить то, что вы хотите. Попробуйте этот скрипт, в этом я получаю имя окна с помощью 'xdotool' и переключаюсь в активное окно с помощью 'wmctrl'.

#!/bin/bash

echo "new tab is about to open..."

winname=`xdotool getactivewindow getwindowname;`

gnome-terminal --tab --active --name="install dependencies..." -- bash -c 'echo "hello";
read new_user_input;
#other commands;
echo "winname = "$1;
wmctrl -a $1;
sleep 5;
' bash "$winname"

echo "hello welcome back to the correct tab, we have been waiting for you! :)"

read new_user_input;
0
ответ дан 19 April 2019 в 14:23

Установка заголовка окон терминала удалена из gnome-терминала. Я попробовал это на терминале rox. Вам нужно установить это два программного обеспечения: -

apt install roxterm
apt install wmctrl

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

#!/bin/bash


roxterm --title="First Tab is this" -- bash -c `

echo "new tab is about to open..."

roxterm --title="Second Tab is This" -- bash -c 'echo "hello";' &
wmctrl -a "First Tab is this";

`&
0
ответ дан 19 April 2019 в 14:23

Другие вопросы по тегам:

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