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 dermdir
, 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?