我经常以平铺配置打开两三个 macOS 终端窗口。有时我想cd
在所有窗口中进入某个特定目录。
我最好的想法是尝试写信给/dev/ttys00*
,例如,
echo -ne "echo hello\x0a\x0d" > /dev/ttys000
这将显示在另一个终端上,但末尾的字节不会触发接受命令。是否有一个字节序列可以做到这一点?(出于安全原因,如果没有,我也不会感到惊讶。)顺便说一句,您可以运行tty
以发现特定窗口映射到哪个设备。
我也尝试过设置$PWD
变量,但它似乎并没有真正改变目录。
答案1
这将显示在另一个终端上,但末尾的字节不会触发被接受的命令。
每个 tty 设备都有两端,就像管道一样。你写入到一端的内容不循环,但输出端却是另一端。例如,/dev/ttyS*
一端是串行端口,另一端是物理串行端口。写入的内容/dev/ttyS0
通过网络发送。
同样,对于伪终端 (ptys),您需要/dev/ttys*
访问由终端应用程序管理的无名“pty master”设备。当您向 写入内容时/dev/ttys000
,它不是外壳接收到的任何信息都作为输入,因为外壳连接到相同的pty 的“从”端。相反,写入由终端应用程序它保存了相应的 pty master 的 fd,并且显示为程序输出。
(一些较旧的 BSD 中,ptys 被命名为/dev/ttyP*
,有/dev/ptyP*
与主端相对应的设备,但我不认为 macOS 有等效的设备。Linux 肯定没有——每次你/dev/ptmx
在那里打开时,你都会得到一个新的pty 对已分配。)
那么如何实现你的愿望呢?
您可以尝试找到一个转义序列,要求终端返回一些内容作为输入。这曾经存在(例如,有一个“告诉我当前窗口标题”序列),但几乎所有终端都出于安全原因禁用它:例如,如果您有
cat
一个恶意文件,它可以设置终端标题并立即要求返回,从而运行命令。你可以让内核伪造输入。在 Linux 上,有
ioctl(TIOCSTI)
可供以下工具使用:写; 它做将输入循环回连接到 tty 同一端的所有其他程序。我不确定它是否适用于 macOS。您可以研究其他自动化方法。如果我没记错的话,macOS 有“Automator” 应用程序和 AppleScript。其他系统可能有与辅助功能挂钩的工具(就像虚拟键盘一样)。