Command-Line
當我在我的電腦上啟動一個程序時,我看到一個文件描述符 6 打開,那個描述符是什麼/關於什麼?
今天我注意到我從一個在啟動時驗證其文件描述符的工具中得到一個錯誤。事實是我得到了一個額外的
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 設置為 apts
。但是,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