当我执行如下命令时:
echo "Hello" > tty/pts/2
它会打印出关于该信息terminal
。它是重定向到该处stdout
还是stderr
从该处重定向tty
?
答案1
大概是你的命令不正确;它会将字符串“Hello”保存到名为2
ie的文件中tty/pts/2
(如果中间目录存在)。
也许你的意思是:
echo "Hello" > /dev/pts/2
它将向第二个伪终端发送字符串“Hello”。
现在,终端内部运行的进程的 STDIN、STDOUT 和 STDERR 都与伪终端本身绑定,因此实际上不可能单独找出终端内部运行的进程的文件描述符。
/proc
您可以通过读取在终端内运行的 shell 的文件描述符来检查,您将看到标准流实际上已符号链接到伪终端。
对于我zsh
在伪终端上的运行/dev/pts/46
:
/proc/self/fd% tty
/dev/pts/46
/proc/self/fd% ls -l
lrwx------ 1 foobar foobar 64 Jun 13 15:07 0 -> /dev/pts/46
lrwx------ 1 foobar foobar 64 Jun 13 15:07 1 -> /dev/pts/46
lrwx------ 1 foobar foobar 64 Jun 13 15:07 2 -> /dev/pts/46
答案2
简单的测试是重定向stdout
,然后stderr
执行命令,/dev/null
看看会发生什么。
adminx@L455D:~$ echo "hello" > /dev/pts/22
hello
adminx@L455D:~$ echo "hello" > /dev/pts/22 > /dev/null # no output , stdout gone
adminx@L455D:~$ echo "hello" > /dev/pts/22 2> /dev/null # stderr gone, but stdout shows up
hello
因此,stdout
这就是你所看到的。
答案3
都不是。stdin
,stdout
并且stderr
只有与流程绑定时才有意义。