Shell 将输出发送到tty不会产生预期结果

Shell 将输出发送到tty不会产生预期结果,shell,unix,io,terminal,zsh,Shell,Unix,Io,Terminal,Zsh,我显然没有期望得到正确的结果 $ man less 在另一个终端: $ ps u # Find that pid of less is 45783 $ lsof -p 45783 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME less 45783 lust cwd DIR 1,4 442 46 /usr/share/man le

我显然没有期望得到正确的结果

$ man less
在另一个终端:

$ ps u 
# Find that pid of less is 45783
$ lsof -p 45783
COMMAND   PID USER   FD   TYPE             DEVICE  SIZE/OFF    NODE NAME
less    45783 lust  cwd    DIR                1,4       442      46 /usr/share/man
less    45783 lust  txt    REG                1,4    137712    9698 /usr/bin/less
less    45783 lust  txt    REG                1,4    600576    9397 /usr/lib/dyld
less    45783 lust  txt    REG                1,4 303120384 2911813 /private/var/db/dyld/dyld_shared_cache_x86_64
less    45783 lust    0   PIPE 0xffffff8025bf38c0     16384
less    45783 lust    1u   CHR               16,2   0t82970     763 /dev/ttys002
less    45783 lust    2u   CHR               16,2   0t82970     763 /dev/ttys002
less    45783 lust    3r   REG                1,4      4589  286688 /private/etc/man.conf
less    45783 lust    4r   CHR                2,0       0t0     306 /dev/tty
$ echo "q" > /dev/ttys002
此时,
manless
正在运行的终端将打印q和换行,而不是退出手册页的显示


我怎样才能让它发送原始的“q”?管道不工作,我得到“zsh:权限被拒绝:/dev/ttys002”。为
cat
切换
echo
并键入它也不起作用。

也许您想要的是一个协进程。zsh支持这些

 coproc bc -l
 print -p 1 + 1
 read -p answer
 echo $answer
 2
这允许您通过
write-p

试试这个:这只是一段示例代码,可以根据需要进行修改。它写入终端的输入队列,/dev/pty3或其他任何东西。仅以root用户身份运行。用法:./putty/dev/pty3

int main(int argc, char **argv)  
{                                                 
   int tty = open(argv[1], O_WRONLY|O_NONBLOCK);
   char ch[80]={0x0};
   char *p=NULL;
   while( fgets(ch, 80, stdin)!=NULL)  //Read keyboard input e.g., q<return>
   {
      for(p=ch; *p && *p!='\n'; p++)
         ioctl(tty, TIOCSTI, p);    // put each byte into /dev/pty3  input queue.                    
   }                       
   close(tty); // ctrl-Z  ends the program.                                      
   return 0;                                         
}       
int main(int argc,char**argv)
{                                                 
int tty=打开(argv[1],O_WRONLY | O_NONBLOCK);
char ch[80]={0x0};
char*p=NULL;
while(fgets(ch,80,stdin)!=NULL)//读取键盘输入,例如q
{
对于(p=ch;*p&&*p!='\n';p++)
ioctl(tty,TIOCSTI,p);//将每个字节放入/dev/pty3输入队列。
}                       
关闭(tty);//ctrl-Z结束程序。
返回0;
}       

似乎您对将输出发送到tty不感兴趣,正如您的问题标题所示,而是对将输入注入tty感兴趣-这是一件非常不同的事情@Celada将程序的输出作为输入发送到终端会话?确实如此。正如我所说,这与将输出发送到终端非常不同!有趣。我不知道coprocs的事。然而,我需要控制的不仅仅是stdin(如果我只需要发送到stdin,我会更自如地使用管道),而是实际翻译寻呼机程序使用的交互式tty。看来实现这一点的唯一合理方法是在PTY上生成寻呼机程序。您想在进程的stdout、stdin、stderr与其他进程之间插入吗?换言之,你想检查“从另一个tty到另一个tty”的所有东西吗?是的,我想翻译输入的东西,并显示出它通常的功能。它本质上需要一个伪终端pty,所以我现在用Perl IO::pty::Easy构建一个。