Por que usar o pipe '|' terminar o segundo processo, existe uma maneira de evitá-lo?

3

Só para dar algum contexto, estou tentando executar este comando

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

O hive termina assim que "set hive.execution.engine ..." foi inserido no shell interativo da seção,

Eu quero que ele fique no shell interativo da seção, mas o shell termina e estou de volta ao shell linux normal.

    
por Fil 10.09.2015 / 12:22

3 respostas

3

Ele sai assim que a entrada é finalizada. Então, não termine:

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

Você não perderá recursos que não estejam lá de qualquer maneira. Isso funciona concatenando o stdin do cat (que é o stdout do echo ) com a entrada do seu terminal. É bem simples. A outra solução cat aqui funcionará da mesma maneira, desde que você a execute a partir de um shell interativo de nível superior.

    
por 10.09.2015 / 12:49
5

Após o echo terminar, a entrada de hive atinge o final do arquivo, então hive é finalizado. Você provavelmente obterá o mesmo efeito se pressionar Ctrl-D no shell interativo. Tente o seguinte:

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

No entanto, você pode perder o movimento do cursor e outros recursos interessantes do shell interativo.

Editar : uma maneira melhor é provavelmente colocar o comando set em ~/.hiverc per os documentos da seção .

    
por 10.09.2015 / 12:33
0

Eu não tenho certeza se o seguinte será de alguma ajuda, mas caso isso aconteça, eu fiz uma pequena pesquisa.

Pode ser implementado como (não aplicado no seu comando)

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

Mas, quanto a signal , ele está obsoleto.

Melhor pode ser

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);
}

Fonte e mais informações:
Impedir que um processo termine ao gravar em um cano quebrado e
Ignore o SIGPIPE sem afetar outros tópicos em um processo

    
por 10.09.2015 / 12:37