假设我启动一个cat
进程来等待一些输入。例如,
$ cat > out.log
在另一个终端中,我可以识别其 PID 并将数据输入其文件描述符 0(零 = STDIN),如下所示:
$ echo "hello" > /proc/2357/fd/0
然后第一个终端做出反应:
$ cat > out.log
hello
有几个问题:1)“hello”字符串显示在实际终端中,而不是重定向到文件,这是由于程序的性质cat
(它只关注 tty/前台)吗?
2)我无法跟踪同一进程的标准输出:
tail -f /proc/2357/fd/1
...
什么也没有出现。对这里发生的事情有什么猜测吗?
答案1
/proc/2357/fd/0 是 cat 进程的文件描述符 0,即终端本身。 /proc/2357/fd/1 是 cat 进程的文件描述符 1,您将其连接到文件 out.log。
现在,如果您向 /proc/2357/fd/0 回显某些内容,它将转到终端,因为那是描述符引用的文件。
如果您将某些内容回显到/proc/2357/fd/1,它将进入out.log,但不会通过cat!
您无法以这种方式向流程回显某些内容。
答案2
您可能想看一下 tee(1) 命令,它基本上是 unix 命令的 T 形连接:它将其 stdin 重定向到 stdout 和文件(然后您可以 tail -F)