我正在尝试编写一个 bash 脚本来自动运行一些命令。但是,其中一些命令应该在它们自己的终端选项卡中运行。所以我在我的 bash 脚本中使用以下内容来打开一个新选项卡:
xdotool key ctrl+shift+t
这可以完成这项工作,但我的 bash 脚本中的下一个命令仍然在前一个终端选项卡中执行。如何使新打开的终端选项卡处于活动状态并运行此选项卡中的下一个命令?
你用的是什么终端模拟器?这强烈依赖于此。
通常,您可以在 shell 脚本中编写要执行的命令,并告诉终端仿真器在脚本启动后执行该脚本。
示例xterm
:
echo '#!/bin/bash' > /tmp/thescript
echo 'ls -la' >> /tmp/thescript
chmod +x /tmp/thescript
xterm -hold -e /tmp/thescript
编辑:我刚刚看到你要求一种方法来实现这一点xdotool
。所以这个答案可能是无效的。如果是,请告诉我 - 然后我会删除它。
你怎么用xdotool
?可以用链来完成,例如:
$ xdotool key "ctrl+shift+t"; xdotool type "ls"; xdotool key Return
如果您只想在后台/并行运行命令,而不是在下一个命令开始之前同步等待每个命令完成,请用 & 号终止它们&
以指示 shell 这样做。
或者,您可以在它们自己的子 shell 中执行命令,方法是用括号括起来(
)
。如果它们是长时间运行的进程,或者您不希望它们的输出污染原始 shell,您可以将它们分叉并捕获它们的输出并使用(setsid command 1>/path/to/log &)
.
如果需要单独的选项卡,您可以使用xdotool
键切换到下一个选项卡绑定或类似的,然后键入您必须在该选项卡中运行的命令。
您可以使用Jacob Vlijm的这个答案xdotool
中的脚本,而不是自己解决这个问题,它包装了一种窗口方法,该方法使用并将wmctrl
命令“发送”到不同的终端窗口。该脚本是用 python 3 编写的,但可以很容易地为所选的 shell 环境重写。
更直接的方法是使用 aTIOCSTI ioctl
将字符注入另一个终端。根据tty_ioctl
手册页:
NAME
ioctl_tty - ioctls for terminals and serial lines
...
DESCRIPTION
The ioctl(2) call for terminals and serial ports accepts many possible
command arguments.
...
Faking input
TIOCSTI const char *argp
Insert the given byte in the input queue
...
这是c和perl包装器,以及此答案引用的python中的示例。