Erro de valor de retorno em scripts bash

Eu tenho um script bash como este:

rm ~/sqoop/"$TABLE"/* rmdir ~/sqoop/"$TABLE" return $? 

Após a execução deste script, ele retorna um valor para o próximo processo, mas embora o script seja executado com êxito e todos os estágios do script sejam concluídos com êxito, ele retorna 1.

Porque isso – o próximo processo não está ocorrendo.

Se eu remover a instrução return, o próximo processo ocorrerá sem problemas. esse problema veio após a gradação de up de cluster do Hadoop que tem Ubuntu 14 e um novo cluster tem Ubuntu 16.

Você pode nos ajudar a entender qual é o problema e como o próximo processo está sendo executado com sucesso se remover o comando return aqui e qual é o impacto na produção se remover a instrução Return?

Comentários

  • qual é a próxima etapa? o que exatamente a próxima etapa verifica?
  • A próxima é HQL (consulta de hive no Hadoop) e tem algumas etapas de negócios que está executando se eu comentar o valor de retorno, está funcionando bem, mas não está em execução se comentar o Retorna. ' t mudei qualquer coisa na lógica de negócios / script de shell, a única coisa que fizemos foi atualizar

Resposta

A instrução return retorna um erro se a instrução não for executada a partir de uma função.

Em funções shell, use return. Em scripts, use exit.

Um pequeno script como

#!/bin/bash return 0 

produzirá o mensagem de erro

line 1: return: can only `return" from a function or sourced script 

e definirá $? como 1.

Se você não “t sair do script com um exit explícito (ou se você sair com exit, mas sem especificar um código de saída), o código de retorno de o script como um todo será igual ao último comando executado.

Ter exit "$?" é igual a simples exit, e se estiver no final do script, pode ser completamente omitido.


Em geral, também sugiro que você use $HOME em vez de til nos scripts. Isso ocorre porque $HOME funciona como qualquer outra variável, enquanto o til é expandido em uma etapa de expansão separada, o que significa que ele não se comporta como uma variável e que não é expandido em strings entre aspas . $HOME também é mais descritivo e, como é um script, você pode usar algumas teclas extras para tornar o código mais legível.

Comentários

  • Tenho uma consulta rápida acima de sua resposta … tentarei acima com exist 0, mas tenho uma consulta por que esse problema ocorre agora apenas anteriormente eu uso a mesma consulta? Funciona se eu comentar retornar declaração isso tem impacto em alguma coisa?
  • @gsrao Se você comentar a declaração return, o código de retorno do script será o do último comando executado, então, no seu caso aqui, você pode definitivamente deixá-lo de fora. Vou adicionar isso à minha resposta.
  • Oh … ótimo … você está salvando minha vida, então meu caso se eu comentar o retorno por padrão o script retornará o sinalizador do último comentário bem-sucedido (rmdir ~ / sqoop / " $ TABLE ") certo? ..aqui mesmo que seu trabalho respondido me se duas consultas simples que estão comendo meu cérebro 1) meu caso, o que é uso de " return $? " como você disse, funcionará da mesma forma se eu comentar o " return $ " 2) o que pode ser possível causar o problema anteriormente?
  • @gsrao Sim, se você comentar o return (que não deveria ' estar lá para começar, já que ' não está em uma função, pelo que eu posso ver ), o status de saída do script será o de rmdir, se ' for o último comando no script. Quanto à sua última pergunta, não ' não entendo muito bem o que você quer dizer com " o problema anterior a agora ".
  • Minha última pergunta … estou usando o mesmo script que usei antes da gradação linux / cluster up que estava funcionando até a gradação cluster up, por que agora só esse problema acontece? qual pode ser a causa deste problema?

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *