コンテキストを提供するためにこのコマンドを実行しようとしています。
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
最初からなかった機能は失われません。これは接続のcat
stdinによって達成されます。(これは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 を無視します。