Sam*_*Sam 3 bash debian io-redirection
学习TLDP 的高级 Bash 脚本指南我无法在 debian 9 的 bash 4.4.12 中重建以下 shell 输出,包括 tty 和 pts:
bash$ lsof -a -p $$ -d0,1,2
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 363 bozo 0u CHR 136,1 3 /dev/pts/1
bash 363 bozo 1u CHR 136,1 3 /dev/pts/1
bash 363 bozo 2u CHR 136,1 3 /dev/pts/1
bash$ exec 2> /dev/null
bash$ lsof -a -p $$ -d0,1,2
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 371 bozo 0u CHR 136,1 3 /dev/pts/1
bash 371 bozo 1u CHR 136,1 3 /dev/pts/1
bash 371 bozo 2w CHR 1,3 120 /dev/null
Run Code Online (Sandbox Code Playgroud)
每当我运行第二个命令时,shell 提示符就会消失,所有键盘输入都停止显示,但我仍然可以运行命令并查看它们的输出。这是为什么?
这是因为您重定向了 shell 的标准错误。
根据标准,这就是符合 POSIX 的 shell 应该编写其交互式提示的地方。
The Bourne Again、Heirloom Bourne、(Debian和FreeBSD)93 Korn、MirBSD Korn、(FreeBSD、OpenBSD 和Debian)PD Korn、(FreeBSD和Debian)Almquist 和Watanabe shell 都符合这方面的要求,并将它们的交互提示写到标准错误。您会看到所有这些都缺乏及时的行为。
然而,不回显输入行为要复杂得多:
exec
命令,以及(因为标准误差不再是终端装置)不能再次关闭它调用用于他们的下一个输入的行编辑器时。因此,您将看到终端线路规则回显了您键入的进一步输入,即使来自 shell 行编辑器的输入回显将转到现在重定向的标准错误。他们的行编辑器也会以微妙的方式出错,例如无法识别任何进一步的终端大小变化。/dev/tty
直接打开另一个文件描述符以控制诸如终端回显之类的东西. 在为下一个输入调用行编辑器时,他们成功地再次关闭回声。因此,您将不会看到您键入的进一步输入由他们的行编辑器或终端行规则回显。该BusyBox的Almquist和ž弹不符合POSIX在这方面。他们都实现了自己的行编辑器。有了这两者,你就会看到附录让你相信会发生的行为。
/dev/tty
. 它在启动时将文件描述符复制到终端设备,然后 ZLE 将其用于所有内容;用于回显键入的输入、读取键入的输入、编写交互式提示以及打开和关闭终端回显。因此,ZLE 不受标准错误、输出甚至输入的后续重定向的影响。如果您愿意,您可以将所有三个重定向到/dev/null
by exec
,Z shell 仍会以交互方式提示您输入并接收输入。(Thompson shell 首先不支持 shellexec
命令机制,因为它早于它的发明。)
你应该向作者 Stéphane Chazelas 抱怨那个附录是错误的,这样它可能会得到修复。
归档时间: |
|
查看次数: |
411 次 |
最近记录: |