今天,我注意到在启动时验证其文件描述符的工具中出现错误。事实是我得到了一个额外的pts
连接:
# In one console I start `cat`
linux $ cat >/tmp/test
# In another console I search for `cat`'s process ID
linux $ ps -ef | grep cat
alexis 34462 25012 0 11:58 pts/17 00:00:00 cat
# Now check the file descriptors:
linux $ ls -l /proc/34462/fd
total 0
lrwx------ 1 alexis alexis 64 Sep 23 11:59 0 -> /dev/pts/17
l-wx------ 1 alexis alexis 64 Sep 23 11:59 1 -> /tmp/test
lrwx------ 1 alexis alexis 64 Sep 23 11:59 2 -> /dev/pts/17
lrwx------ 1 alexis alexis 64 Sep 23 11:59 6 -> /dev/pts/17
正如我们所看到的,stdin
被设置为目标文件名/tmp/test
。正如预期的那样,0 和 2 设置为 a pts
。
那么 6 是什么?
我想这可能来自我的 Rails 环境。该rvm
脚本对我的控制台做了一些“魔法”,当我cd
进入包含名为 的文件的目录时Gemfile
,它会检测到它。话虽这么说,我认为这只是一个cd
别名...还有什么可以将这样的文件描述符添加到我的命令行中吗?我可以做什么来测试它的来源以及它提供的功能?
更新:我可以确认,如果我在注释掉 RVM 初始化 ( . ~/.rvm/scripts/rvm .
) 之后打开一个新控制台,那么我不会获得额外的伪终端文件描述符。我仍然想知道他们怎么能做到这一点?
答案1
RVM 启动时会向当前连接的任何标准错误打开一个新的文件描述符。因此,在 RVM 环境中,文件描述符 6 是 RVM 日志输出。这样,无论标准错误是否已重定向,RVM 都可以通过将输出写入文件描述符 6 来记录到同一位置。
文件描述符已打开在......的最后scripts/functions/logging
。
exec 6>&2
这exec
builtin 不带参数,但带有重定向,在 shell 进程内执行重定向。因此,exec 6>&2
将文件描述符 6 打开到 shell 中的任何文件描述符 2。从 shell 启动的程序继承此文件描述符。
当 RVM 想要记录某些内容时,它(通常)输出到文件描述符 6。这发生在功能rvm_error
, 例如。
例如,以下代码在从终端启动的 RVM 环境中执行,它将“Stuff gone”写入myfile.log
,但写入Hello
终端。
f () {
…
echo >&2 "Stuff happened"
rvm_error "Hello"
}
f 2>myfile.log
答案2
该特殊文件包含当前线程 futex 上下文句柄。