Shell 脚本:焦点已经从第二个终端选项卡打开终端选项卡

tat*_*tsu 10 command-line scripts gnome-terminal

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

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

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;
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?

我有这个想法,因为显然 --active 参数调用了一些使新选项卡成为焦点的东西(如果调用它的选项卡未处于活动状态,甚至可以工作)。所以某种性质的东西一定是可能的。

Win*_*nix 5

手动方式

根据此问答:默认终端应用程序中是否有在选项卡之间切换的热键?

打开新标签后,您可以使用Ctrl+返回上一个标签pg up

脚本中的自动化方法

为了将信号发送到 Bash Shell(gnome-terminal),请使用 xdotool

sudo apt install xdotool
Run Code Online (Sandbox Code Playgroud)

在您的脚本中发出以下命令:

xdotool key Control+Page_Up
Run Code Online (Sandbox Code Playgroud)

我刚刚在 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"'
Run Code Online (Sandbox Code Playgroud)

我们将修改示例命令如下所示:

gnome-terminal -e 'bash -c "second-script.sh; exec bash"'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

永远记住使用以下命令标记脚本可执行:

chmod a+x second-script.sh
Run Code Online (Sandbox Code Playgroud)

注意:这会打开第二个终端窗口,该窗口在用户关闭之前一直保持打开状态。这可以更改为自动关闭。

我们的第一个(父)脚本如下所示:

#!/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
Run Code Online (Sandbox Code Playgroud)

当前方法的优点:

  • 您可以看到两个窗口同时运行。使用第二个选项卡,您看不到两个脚本输出。
  • 子进程 ( second-script.sh) 完成后输出仍然可见,直到窗口关闭。

威兰工具

控制活动窗口的 Wayland 工具并不多。

我确实找到了这个:ydotool但你需要手动编译它。没有 Debian/Ubuntu 安装包。有一些用户可以使用的 Arch Linux 安装包。