Para reiterar os conselhos dados comentários :
- Exclua as instruções
continueda 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 trueno 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_MODEnão é nula. Você parece quererif [ "$SILENT_MODE" ]. - Mas você pode estar se enganando.
if [ "$SILENT_MODE" ]é verdadeiro, mesmo se$SILENT_MODEforfalse- tudo o que está fazendo testando se a string não é nula, então chamandoCheckGit falseainda 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_INSTALLEDobtém o status de saída doprintf. Você precisa definirGIT_INSTALLEDantes. - Seu teste,
if [[ ! $(git --version) ]]; then, testes, não "o código de retorno" (como você diz na pergunta), mas segit --versionescreve alguma coisa na saída padrão. Isso pode ser o que você quer. Essa pode ser a melhor maneira de testar se ogitestá 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-elsemais 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 fiOs 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 .