在尝试理解 TTY 时,我有一些黑暗区域。
在我的系统上,我有/dev/tty[1-63]. 正在udev创建这些字符设备吗?以及如何访问它们(例如可以使用 Ctrl+Alt+F2 访问 tty2)?/dev/tty40例如,我如何访问?
据我了解,当我访问/dev/tty1, 时agetty被调用,然后调用login. agetty电话之外的真正作用是login什么?
我读过这里是ssh被认为是一个PTY。为什么?如果我ssh在控制台中运行命令(比如在 Debian 服务器中),这里的“pty”方面从何而来ssh?对我来说,这就像我在使用任何其他实用程序,如cat或sed,那么这里的“pty”方面从何而来?
在screen或者tmux使用这个术语似乎更合理(尽管我认为它很不常见,这些应该被命名为“多路复用器”)。
tty在终端中的 a上运行命令时,它返回/dev/pts/10。
除此之外还有文件/dev/stdout /dev/stdin和/dev/stderr. 直接与他们互动会在终端中显示结果。
user@laptop:build$ tty
/dev/pts/10
user@laptop:build$ echo "Test" > /dev/stdout
Test
user@laptop:build$ echo "Test" > /dev/stdin
Test
user@laptop:build$ echo "Test" > /dev/stderr
Test
Run Code Online (Sandbox Code Playgroud)
同时,任何CLI应用程序,从shell启动,将有描述打开文件stdout/ stderr/ stdin。即,如果您运行打印某些内容的脚本,则打印相当于写入stdout.
到目前为止stdout/ stderr/stdin是唯一的接口shell工作与。应用程序也是如此。
某些操作系统组件最终会移动写入stdout终端的数据,否则我将看不到任何打印内容。
和stdout/stdin/stderr终端之间的连接何时何地发生,以便与std*终端上的某些内容进行交互?
我想挑战的粗略假设是:
/dev/stdout,/dev/stdin并且/dev/stderr由正在运行的 shell 创建,它们在没有 shell 的情况下不存在。Shell 使用代表终端的实际设备文件 (
/dev/pts/10)建立通信通道/dev/stdout,/dev/stdin并通过、和公开终端功能/dev/stderr。通过这种方式,shell 为应用程序提供了一个简单的文件界面,而不是让每个应用程序担心如何处理设备文件以进行简单的打印。 …
有几个点可以通过 I/O,其中一些(据我所知)是 shell、pty、tty、termios、终端模拟器应用程序。在大多数终端模拟器中,长命令行(超过当前 $COLUMNS 的命令行)在用户通过按 Enter 提交命令之前换行到一个新行。此外,当如预期的那样从命令行中删除适当数量的字符时,该行将向后换行到上面的行。
我的问题是:这种魔法通常在哪里处理?它是 termios 设置,还是 shell 的一部分,还是终端模拟器应用程序对此负责?
有关更多上下文,我在 Ubuntu 上使用 Terminator 终端模拟器应用程序 - 换行工作非常好(所以我的 $PS1 提示应该没有问题)。但是我正在开发我自己的终端模拟器应用程序,它与 go pty spawner (github.com/kr/pty) 一起工作,我遇到了长行没有换行的问题,但是同一行。
每次重新启动后,我必须设置chmod o+rw /dev/ttyS0为能够通过bash.
设备关闭后是否可以保存权限以及波特率、位、停止位和奇偶校验?
请注意,我ksh在 CentOS 中使用和运行。
我有一个 shell 脚本,其中记录器功能设置为:
if tty -s
then
echo "${FOO}" | tee -a ${BAR_LOG_FILE}
else
echo "${FOO}" >> ${BAR_LOG_FILE}
fi
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我将它重构if为看起来像if我代码中的所有其他测试时,它停止运行。
为什么?
我的重构如下:
if [ tty -s ];
then
echo "${FOO}" | tee -a ${BAR_LOG_FILE}
else
echo "${FOO}" >> ${BAR_LOG_FILE}
fi
Run Code Online (Sandbox Code Playgroud)
我唯一的改变是在 周围加上括号if并添加一个;,就像我的其余if测试一样,它们都按预期工作。
我的重构导致了一个错误,看起来像BAR_LOG_FILE无法找到。
这里发生了什么?
当我使用时:
date > /dev/tty3
Run Code Online (Sandbox Code Playgroud)
输出被传送到第一个 cli 终端。
但我的问题是为什么终端不要求输入密码。我们使用终端进行输出,命令被传递到终端,那么如何在不询问密码的情况下向我们显示输出。
跑步时
sudo dd if=/dev/sda
Run Code Online (Sandbox Code Playgroud)
内部 PC 扬声器发出声音。也是所有字体,甚至提示和打字输入都有不同的字符,例如“?” 或者 ”•”。
如果您需要了解更多,请发表评论。
我通常做的是 of=/dev/null 或 >>/dev/null 用于读取性能测试和旋转光驱(使用count=1 iflag=direct skip=500000),其中我跳到 LBA 500000 将激光镜头放在中央数据部分。但是我想尝试一下,如果我不将输出重定向到任何地方会发生什么,然后就发生了。
有趣的事实:同样的情况也发生在 Windows 上。
tty ×8
terminal ×3
pty ×2
shell ×2
console ×1
devices ×1
getty ×1
ksh ×1
linux ×1
password ×1
permissions ×1
serial-port ×1
ssh ×1
terminology ×1
test ×1