这可能有点模糊,但我正在尝试做一些有点棘手的事情:
我正在编写一个脚本,用命令打开一个新选项卡,我想在用户输入到辅助选项卡后切换回第一个选项卡(事实上,此选项卡的焦点是预期的行为,也是最重要的):
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 参数会调用某些东西来使新选项卡成为焦点(并且即使调用它的选项卡未处于活动状态也能起作用)。所以某些性质的事情一定是可能的。
答案1
手动方法
根据此问答:是否有一个热键可以在默认终端应用程序中的选项卡之间切换?
打开新标签页后,你可以使用Ctrl+返回上一个标签页pg up
脚本内的自动化方法
为了将信号发送到 Bash Shell(gnome-terminal),请使用
xdotool
:
sudo apt install xdotool
在您的脚本中发出此命令:
xdotool key Control+Page_Up
我刚刚在 Ubuntu 16.04 LTS 上完成安装和测试,它运行完美。它应该可以在所有 X11 桌面上运行。
更传统的方法
OP 希望获得 Wayland 支持,更重要的是,希望获得一种可与许多 *NIX 发行版兼容的 POSIX 方法。
来自此问答:
...这个命令是:
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 安装包,您的一些用户可以使用它。
答案2
嗯,它比我预期的花费了更多的时间。最后,我设法得到了你想要的东西。试试这个脚本,我使用“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;
答案3
您可以尝试模拟击键来切换到其他选项卡:
您可以使用xdotool
来模拟任何按键组合。要在 gnome-terminal 中更改选项卡,请使用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
答案4
gnome-terminal 中已删除设置终端窗口标题的功能。因此,我在 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";
`&