为什么使用管道“|”终止第二个进程,有办法阻止吗?

为什么使用管道“|”终止第二个进程,有办法阻止吗?

只是为了提供一些上下文,我正在尝试运行这个命令

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命令放入~/.hivercperHive 文档

答案2

输入结束后它就会退出。所以不要结束它:

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

您不会失去任何本来就不存在的功能。这是通过连接 的catstdin来实现的(这是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而不影响进程中的其他线程

相关内容