この状況で「破損したパイプ」が表示されることはまれですが、正常です。
を実行するとtype rvm | head -1
、bashはtype rvm
1つのプロセスで実行されhead -1
、別のプロセスで実行されます。1のstdoutはパイプのtype
"write"端に接続され、stdinは"read"端に接続されます。両方のプロセスが同時に実行されます。head
head -1
プロセスは、(通常8キロバイトのチャンクに)標準入力からデータを読み出し、単一の(に係る線プリントアウト-1
クローズする管の端部を「読み取り」引き起こし、オプション)、および終了し。以来rvm
関数非常に長い(構文解析およびBashによって再構築された後、約11 KB)、このことは意味head
出口はながらtype
依然として書き出すデータの数KBを有しています。
この時点で、type
もう一方の端が閉じられているパイプ(破損したパイプ)に書き込みを試行しているため、それが調整したwrite()関数はEPIPEエラーを返します。このエラーに加えて、カーネルはSIGPIPEシグナルもに送信type
します。これはデフォルトでプロセスをすぐに強制終了します。
(シグナルは、ほとんどのユーザーが最初のプロセスを実行し続けてどこにも書き込もうとしないため、対話型シェルで非常に役立ちます。一方、非対話型サービスはSIGPIPEを無視します。そのような単純なエラーで死にます-そのため、エラーコードは非常に便利です。)
ただし、シグナルの配信は100%即時ではなく、write()がEPIPEを返し、シグナルを受信する前にしばらくの間プロセスが実行し続ける場合があります。この場合、type
SIGPIPEによって強制終了される前に、書き込みの失敗を通知し、エラーコードを変換し、エラーメッセージをstderrに出力するのに十分な時間を確保します。(type
bash自体の組み込みコマンドであるため、エラーメッセージには「-bash:type:」と表示されます。)
これは、type
プロセスとカーネルのシグナル配信コードが異なるコアで文字通り同時に実行できるため、マルチCPUシステムではより一般的であるようです。
type
組み込み(bashのソースコード内)にパッチを適用して、write()関数からEPIPEを受信するとすぐに終了するようにすることで、このメッセージを削除することができます。
ただし、心配する必要はありませんrvm
。インストールとはまったく関係ありません。