Para reiterar os conselhos dados comentários :
- Exclua as instruções
continue
da funçãoCheckGit
.- Eles não são necessários,
- e - o que você pode não ter percebido - eles causam,
não apenas um retorno imediato (da função) para o loop principal,
mas um retorno imediato para a declaração
while true
no topo do loop principal. Portanto, como Tomasz apontou , sua declaraçãoexec 2>&3 3>&-
não está sendo executada.
Notas gerais:
-
if [ SILENT_MODE ]
é sempre verdadeiro como mosvy apontou , porque está apenas testando se a stringSILENT_MODE
não é nula. Você parece quererif [ "$SILENT_MODE" ]
. - Mas você pode estar se enganando.
if [ "$SILENT_MODE" ]
é verdadeiro, mesmo se$SILENT_MODE
forfalse
- tudo o que está fazendo testando se a string não é nula, então chamandoCheckGit false
ainda resultará na informação sendo exibida. - E, mesmo que você não esteja se enganando,
você pode estar enganando a pessoa que tem que manter este roteiro na próxima semana.
E sim, essa pessoa pode ser você.
Sua lógica aparente é “se estiver no modo silencioso, relate informações extras”.
Isso é logicamente atrasado;
faria mais sentido dizer
if [ "$SILENT_MODE" = false ]
, ou então chame a variávelVERBOSE_MODE
. -
$?
é muito efêmero. É sempre o resultado do comando mais recente. Então, se você fizerif check whether git is installed ; then printf "GIT IS NOT INSTALLED.\n" else printf "GIT IS CURRENTLY INSTALLED.\n" fi GIT_INSTALLED=$?
entãoGIT_INSTALLED
obtém o status de saída doprintf
. Você precisa definirGIT_INSTALLED
antes. - Seu teste,
if [[ ! $(git --version) ]]; then
, testes, não "o código de retorno" (como você diz na pergunta), mas segit --version
escreve alguma coisa na saída padrão. Isso pode ser o que você quer. Essa pode ser a melhor maneira de testar se ogit
está instalado. Mas pode ser melhor (e muitas vezes, em geral, é melhor) para verificar o status de saída do comando. - Uma nota de estilo: acho as instruções
if
-then
-else
mais fáceis para entender se a parte “verdadeira” é a primeira. Seu script está dizendoif git is not installed then say that it's not installed else (i.e., if it's NOT not installed) say that it's installed fi
Os negativos duplos são confusos. - E sim;
exec 2> /dev/null
é útil se você quiser suprimir o erro padrão de 42 instruções em uma linha. Se você precisar afetar apenas um único comando, basta colocar2> /dev/null
(ou> /dev/null 2>&1
) nesse comando, como mosvy sugeriu .