手动方法

手动方法

这可能有点模糊,但我正在尝试做一些有点棘手的事情:

我正在编写一个脚本,用命令打开一个新选项卡,我想在用户输入到辅助选项卡后切换回第一个选项卡(事实上,此选项卡的焦点是预期的行为,也是最重要的):

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";

`&

相关内容