Command-Line

當我在我的電腦上啟動一個程序時,我看到一個文件描述符 6 打開,那個描述符是什麼/關於什麼?

  • November 2, 2020

今天我注意到我從一個在啟動時驗證其文件描述符的工具中得到一個錯誤。事實是我得到了一個額外的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 .) 之後打開一個新控制台,那麼我不會得到那個額外的偽終端文件描述符。我仍然想知道他們怎麼能做到這一點?

RVM 在啟動時打開一個新的文件描述符,指向目前連接到的任何標準錯誤。因此,在 RVM 環境中,文件描述符 6 是 RVM 日誌輸出。這樣,RVM 可以通過將輸出寫入文件描述符 6 來記錄到同一位置,而不管標準錯誤是否已被重定向。

文件描述符scripts/functions/logging.

exec 6>&2

exec不帶參數但帶有重定向的內置函式在 shell 程序內執行重定向。因此exec 6>&2打開文件描述符 6 到 shell 中的任何文件描述符 2。從 shell 啟動的程序會繼承此文件描述符。

當 RVM 想要記錄一些東西時,它(通常)輸出到文件描述符 6。例如,這發生在函式rvm_error

例如,以下程式碼在從終端啟動的 RVM 環境中執行,它將“發生的事情”myfile.log寫入 ,但寫入Hello終端。

f () {
 …
 echo >&2 "Stuff happened"
 rvm_error "Hello"
}
f 2>myfile.log

引用自:https://unix.stackexchange.com/questions/611012