为什么我不能从另一个终端写入终端设备的标准输入

Nat*_*hat 3 unix linux bash shell pty

我在 Gnome 桌面管理器 Ubuntu 中打开了两个 pts 终端。

我想要做的是使用终端 /dev/pts/1 使用重定向向终端 /dev/pts/0 写入一些内容,例如:

##in pts/1
echo date > /dev/pts/0   
Run Code Online (Sandbox Code Playgroud)

但是在 pts/0 中,仅打印日期并且按 Enter 不会执行它。所以我猜 comamnd 不会进入 pts/0 的标准输入。所以我尝试将输出echo date传输到 /dev/pts/0 这给了我权限被拒绝的错误,我成为了 root 并更改了它的权限,但我仍然无法获得date在 pts/0 中运行的命令。

我正在尝试这些东西用于学习目的。所以我真的很困惑它是如何在这里工作的,以及我应该怎么做才能完成它。

Bar*_*mar 7

写入终端设备只会在终端上打印输出。如果它将文本塞回输入缓冲区,那么您打印的所有内容都stdout将循环回stdin,因为它们都连接到同一个终端设备。

为了将数据放入伪 tty 的输入缓冲区,您必须写入其主设备。不幸的是,它们在 Linux 的文件系统中没有不同的名称。有一个/dev/ptmx设备,主进程grantpt()用来创建一个与其链接的从属进程,然后再生成将其用作其控制终端的子进程。因此,文件系统中没有任何可以写入的内容将馈入 pty 的输入缓冲区。


小智 2

您可以通过执行以下命令来完成此操作(从 /dev/pts/1 或另一个 tty):

执行1>/dev/pts/0

停用

exec 1>/dev/pts/1 #或者你实际的原始tty地址。

基本上你正在取代 tty 标准输入。

编辑以获取更多详细信息。

在这种情况下,“exec”启动一个新的 bash,您可以为其提供一组新的环境变量,通常您无法即时更改这些变量。有关更多详细信息,请执行“man exec”。

“1>/dev/pts/0”在这里我们说的是,“无论我在这个新的 bash 上输入什么,都将其写入另一个 bash,它确实会执行此操作,但所有标准输出都将显示在原始 tty 上。

祝你学习linux好运,希望你喜欢它。