只是为了提供一些上下文,我正在尝试运行这个命令
echo "set hive.execution.engine=tez;" | hive
一旦“set hive.execution.engine...”进入 hive 交互式 shell,hive 就会终止,
我希望它保留在 hive 交互式 shell 中,但 shell 随后终止,我又回到了正常的 linux shell。
答案1
完成后echo
,输入hive
到达文件末尾,因此hive
终止。如果您Ctrl-D在交互式 shell 中点击,可能会得到相同的效果。请尝试以下操作:
(echo "set hive.execution.engine=tez;" ; cat ) | hive
但是,您可能会失去光标移动和交互式 shell 的其他良好功能。
编辑:更好的方法可能是将你的set
命令放入~/.hiverc
perHive 文档。
答案2
输入结束后它就会退出。所以不要结束它:
echo "set hive.execution.engine=tez;" | cat - /dev/tty | hive
您不会失去任何本来就不存在的功能。这是通过连接 的cat
stdin来实现的(这是echo
的标准输出)与来自终端的输入。这很简单。cat
只要您从顶级交互式 shell 运行它,这里的另一个解决方案就会以相同的方式工作。
答案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而不影响进程中的其他线程