コンピューターでプロセスを開始すると、ファイル記述子番号 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 が a に設定されていptsます。

でも6って何?

Rails環境に由来するのではないかと考えています。rvmスクリプトが私のコンソールにいくつかの「魔法」をし、ときに私cdという名前のファイルとディレクトリにGemfile、それを検出します。そうは言っても、それは単なるcdエイリアスだと思っていました...コマンドラインにそのようなファイル記述子を追加できるものはありますか? これがどこから来て、どのような機能を提供するかをテストするにはどうすればよいですか?


更新: RVM の初期化 ( . ~/.rvm/scripts/rvm .)をコメントアウトした後に新しいコンソールを開いた場合、その余分な疑似端末ファイル記述子を取得できないことを確認できます。私はまだ疑問に思っています。

Gilles'SO-悪であることをやめなさい '

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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ