经过大约一个小时的谷歌搜索,我无法相信之前没有人真正问过这个问题...
因此,我在TTY1上运行了一个脚本。如何使该脚本在TTY2上启动任意程序?
- 我发现
tty
,它告诉您当前正在使用哪个TTY。 - 我发现
writevt
,它将单行文本写入不同的TTY。 - 我发现
chvt
,它更改了当前显示的TTY。
我不想显示 TTY2。我只希望主脚本继续正常执行,但是如果我手动切换到TTY2,则可以与第二个程序进行交互。
经过大约一个小时的谷歌搜索,我无法相信之前没有人真正问过这个问题...
因此,我在TTY1上运行了一个脚本。如何使该脚本在TTY2上启动任意程序?
tty
,它告诉您当前正在使用哪个TTY。writevt
,它将单行文本写入不同的TTY。chvt
,它更改了当前显示的TTY。我不想显示 TTY2。我只希望主脚本继续正常执行,但是如果我手动切换到TTY2,则可以与第二个程序进行交互。
Answers:
setsid sh -c 'exec command <> /dev/tty2 >&0 2>&1'
只要没有其他东西正在使用另一个TTY(/dev/tty2
在此示例中),这应该起作用。这包括getty
可能正在等待某人登录的过程。如果有多个进程从TTY读取其输入,则会导致意外结果。
setsid
负责在新会话中启动命令。
请注意,command
必须注意stty
正确设置设置,例如打开“ cooked mode”,onlcr
以便输出换行符将添加回车等。
/dev/stdin
,/dev/stdout
和/dev/stderr
。ps
轻松表明command
您的情况根本没有控制终端。
sleep 1000
在这里仍然无法使用。不过,我使用了一个伪tty(我想这不会有所作为)。
setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'
在终端仿真器窗口中运行。/dev/pts/4
是另一个终端仿真器窗口(同一用户,bash
正在运行)。
我刚刚发现:
其中一条评论提到了一个叫的东西openvt
。这个命令似乎完全可以满足我的要求!
http://linux.about.com/library/cmd/blcmdl1_openvt.htm
除非有人知道不同,否则我认为这可能是做到这一点的“正确”方法。
(我只是尝试了一下,它似乎工作正常-即使getty
正在运行,它也会选择下一个未使用的终端。我猜想VT不会“打开”,除非您切换到一个以尝试登录...)
[command] > /dev/tty2
(必须已经登录tty2)?