今日、起動時にファイル記述子を検証するツールからエラーが発生していることに気付きました。実際、私は余分な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
引数なしの組み込みは、しかし、リダイレクトで、シェルプロセス内のリダイレクションを実行します。したがってexec 6>&2
、シェル内のファイル記述子 2 に対してファイル記述子 6 を開きます。シェルから起動されるプログラムは、このファイル記述子を継承します。
RVMは何かをログに記録したい場合は、(通常は)ファイルディスクリプタ6.これがで発生する出力機能、たとえば、。rvm_error
たとえば、次のコードは、ターミナルから起動された RVM 環境で実行され、「何かが起こった」をmyfile.log
に書き込みますHello
が、ターミナルに書き込みます。
f () {
…
echo >&2 "Stuff happened"
rvm_error "Hello"
}
f 2>myfile.log
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加