2番目のプロセスを終了するためにパイプ「|」を使用するのはなぜですか?これを防ぐ方法はありますか?

2番目のプロセスを終了するためにパイプ「|」を使用するのはなぜですか?これを防ぐ方法はありますか?

コンテキストを提供するためにこのコマンドを実行しようとしています。

echo "set hive.execution.engine=tez;" | hive

「set hive.execution.engine...」が Hive 対話型シェルに入ると、Hive は終了します。

ハイブのインタラクティブシェルに残りたいのですが、シェルは終了して通常のLinuxシェルに戻ります。

答え1

完了すると、echo入力はhiveファイルの終わりに達してhive終了します。インタラクティブシェルをクリックすると、Ctrl-D同じ効果が得られます。以下を試してください。

(echo "set hive.execution.engine=tez;" ; cat ) | hive

ただし、対話型シェルのカーソル移動やその他の便利な機能が失われる可能性があります。

編集する:より良いアプローチはコマンドsetです~/.hivercハイブ文書

答え2

入力後終了します。だから終わらないでください。

echo "set hive.execution.engine=tez;" | cat - /dev/tty | hive

最初からなかった機能は失われません。これは接続のcatstdinによって達成されます。(これはecho標準出力です)端末からの入力で。これはとても簡単です。catここの別の解決策は、トップレベルの対話型シェルで実行する限り、同じ方法で動作します。

答え3

次の内容が役に立つかどうかはわかりませんが、万が一に備えていくつかの調査をしてみました。

次のように実装できます(あなたのコマンドには適用できません)。

if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
  perror(0);
  exit(1);
}

しかし、についてはsignalもう使用されていません。

より良いかもしれません

struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGPIPE, &sa, 0) == -1) {
  perror(0);
  exit(1);
}

ソースと追加情報:
破損したパイプへの書き込み中にプロセスが終了しないようにする そして
プロセスの他のスレッドに影響を与えずに SIGPIPE を無視します。

関連情報