это может показаться немного странным, но я пытаюсь сделать что-то немного сложнее:
Я пишу сценарий, который открывает новую вкладку с командами, я хотел бы вернуться к Первая вкладка после того, как пользователь вводит данные на дополнительную вкладку (тот факт, что эта вкладка фокусируется, является предполагаемым поведением и наиболее важным):
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 вызывает нечто, что фокусирует новую вкладку (и даже работает, если вкладка, вызывающая это, не активна). поэтому что-то от природы должно быть возможным.
Вы можете попробовать симулировать нажатия клавиш, чтобы перейти на другую вкладку:
Вы можете использовать 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
В соответствии с этим Q & A: Существует ли горячая клавиша для переключения между вкладками в приложении терминала по умолчанию?
После открытия новой вкладки вы можно вернуться на предыдущую вкладку с помощью Ctrl kbd> + pg up kbd>
Для отправки сигнала в 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 для управления активными окнами.
Я нашел это: ydotool , но вам нужно будет скомпилировать его вручную. Установочного пакета Debian / Ubuntu не существует. Есть установочный пакет Arch Linux, который могут использовать некоторые из ваших пользователей.
Ну, это занимает больше времени, чем я ожидал. Наконец-то мне удается получить то, что вы хотите. Попробуйте этот скрипт, в этом я получаю имя окна с помощью '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;
Установка заголовка окон терминала удалена из 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";
`&