让我们运行cat
然后输入a
then ^D
- 你会看到cat
没有退出。
与cat
+ a
+ Enter
+比较^D
- 现在 cat 确实退出了。
那么,为什么在第一种情况下^D
需要按两次退出cat
,而^D
在第二种情况下只需要按一次?
在 Debian 系统上END
按键生成^[[F
:
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[F 27 0033 0x1b
91 0133 0x5b
70 0106 0x46
Run Code Online (Sandbox Code Playgroud)
但是为什么这个键和弦不在terminfo 中?
$ infocmp -1 | grep end
kend=\EOF,
Run Code Online (Sandbox Code Playgroud)
尽管如此,ncurses设法正确地将其识别为KEY_END
. 如何?
TERM
是 xterm-256color
顺便说一句,拥有kend
andend
而不仅仅是背后的动机是end
什么?(对于khome
和home
)
编辑
正如 Johan Myréen 的评论中所说,khome
字符串是按下 Home 键产生的序列。但是在 Debian 上按 Home 键会产生home
. 为什么?
$ showkey -a
Press …
Run Code Online (Sandbox Code Playgroud) 假设我有一个文件名和不同的扩展名:
test.tex
test.pdf
Run Code Online (Sandbox Code Playgroud)
只输入不带扩展名的文件名,然后输入整个文件名更容易。这是可能的,因为相应的程序知道他们需要的扩展名并自动附加它。以下示例完美运行:
tex test
pdf-viewer test
Run Code Online (Sandbox Code Playgroud)
但是在这里使用 bash 补全总是让我厌烦添加尾随点。例如:
tex te<TAB>
Run Code Online (Sandbox Code Playgroud)
变成了
tex test.
Run Code Online (Sandbox Code Playgroud)
但是应用程序会失败并报错;每次点击后我都必须按退格键<TAB>
:-(
如何告诉 bash 在进行自动完成时不要添加尾随点?
当未打开 pty 的从属端时,strace
在该过程中,会read(master_fd, &byte, 1);
显示以下内容:
read(3,
Run Code Online (Sandbox Code Playgroud)
因此,当没有人连接到 pty 的从属端时,read()
等待数据 - 它不会返回错误。
但是当 pty 的从属端被一个进程打开并且该进程退出时,这个进程会read()
死掉:
read(3, 0xbf8ba7f3, 1) = -1 EIO (Input/output error)
Run Code Online (Sandbox Code Playgroud)
pty 是用
master_fd = posix_openpt(O_RDWR|O_NOCTTY)
Run Code Online (Sandbox Code Playgroud)
pty的slave端用
comfd = open(COM_PORT, O_RDWR|O_NOCTTY)
Run Code Online (Sandbox Code Playgroud)
为什么在read()
打开 pty 从属端的进程退出时退出?这是在哪里描述的?
具体来说,让我们用伪终端术语来说话。假设我们有文件描述符master
和slave
一个伪终端对(假设它是一个控制 tty)。禁用IXON
on master
(或slave
,其工作原理相同)意味着当我们这样做时write(master, &control_s_code, 1)
,read(slave, &byte, 1)
将获得此代码。同样的担忧control_q_code
。问题是:禁用有IXOFF
什么作用?
我想less
用最新的修复程序进行编译。
我这样做:
git clone https://github.com/gwsw/less
cd less/
autoheader
autoconf
./configure
make
Run Code Online (Sandbox Code Playgroud)
但是这样make
说:
make: *** No rule to make target 'funcs.h', needed by 'main.o'. Stop.
Run Code Online (Sandbox Code Playgroud)
没有创建的 Makefile 规则 funcs.h
那么,如何less
从源代码编译呢?
我试图了解ssh
的-t
选项:
-t
强制伪终端分配。这可用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制 tty 分配,即使 ssh 没有本地 tty。
所以,TTY 是一个设备。引用 TTY 的一种方法是通过描述符(通过打开 TTY 设备获得)。STDIN、STDOUT 和 STDERR 是描述符。但它们不一定是指 TTY 设备。-t
选项强制它们引用 TTY 设备。这是为了理解这个选项的作用的正确推理方式吗?
使用普通的 STDIN、STDOUT 和 STDERR 可能无法实现的 TTY 有什么特别之处?
-t
欢迎使用选项用例的示例。
通过哪种机制ssh
分配该 TTY?是ssh
在服务器上还是在客户端上创建新的 TTY?如何检查这个?(/dev/
必须出现一个新节点或其他什么……)这个新的 TTY 如何与现有的 STDIN、STDOUT 和 STDERR 相关联?