tput não funciona na instrução if

1

Estou tentando usar o comando tput em um script bash if statement, mas por algum motivo ele está se comportando de forma inesperada. Ao executar o comando e, em seguida, verificar o código de saída apenas na instrução if, as coisas funcionam corretamente, no entanto, ao executar o comando na instrução if diretamente, as coisas não funcionam mais. Aqui está um script simples para ilustrar o meu problema:

#!/bin/bash

tput setaf 1
if [ $? ]
then
  echo "first if works"
fi

if tput setaf 1
then
  echo "second if works"
fi

A execução deste script só imprime "first if works". As duas instruções if não deveriam funcionar, pois são equivalentes? Estou esquecendo de algo? BTW, isso está rodando no FreeBSD no caso que importa.

    
por Harry Muscle 22.07.2018 / 03:48

1 resposta

8

Estas declarações não são equivalentes.

O primeiro está verificando se $? é uma string não vazia ; sempre será, então o corpo do primeiro if será sempre executado. [ string ] é

True if the string string is not the null string; otherwise, false.

O segundo está verificando se tput setaf 1 foi bem-sucedido ou, alternativamente, se seu status de saída (e portanto $? ) é zero . O corpo do segundo if será executado somente quando o comando tput for bem-sucedido. É amplamente equivalente a

tput setaf 1
if [ $? -eq 0 ]
...

O resultado que você está descrevendo indica que tput setaf 1 está saindo com algum código diferente de zero (por exemplo, 1). " 1 " é uma string não vazia, mas não é zero. tput setaf 1 ; echo $? mostraria qual é o código atual, que você poderia investigar mais a seguir.

    
por 22.07.2018 / 04:04