Команда tput не работает в операторе if

Я пытаюсь использовать команду tput в скрипте bash if, но по какой-то причине она ведет себя неожиданно. Однако при выполнении команды и проверке кода выхода только в операторе if все работает правильно, но при непосредственном запуске команды в операторе if вещи больше не работают. Вот простой скрипт для иллюстрации моей проблемы:

#!/bin/bash tput setaf 1 if [ $? ] then echo "first if works" fi if tput setaf 1 then echo "second if works" fi 

При запуске этого скрипта выводится только «первый, если работает». Не должны ли они оба работать, если операторы работают, поскольку они эквивалентны? Я что-то пропустил? Кстати, это работает на FreeBSD в случае, если это имеет значение.

Эти заявления не эквивалентны.

Первый проверяет, есть ли $? непустая строка ; так будет всегда, поэтому тело первого всегда будет работать. [ string ]

True, если строка не является пустой строкой; иначе ложно.

Второй проверяет, tput setaf 1 ли tput setaf 1 или, альтернативно, tput setaf 1 ли его статус выхода (и, следовательно, $? ) Нулю . Тело второго if будет работать только при tput команды tput . Это в целом эквивалентно

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

Результат, который вы описываете, указывает на то, что tput setaf 1 с ненулевым кодом (например, 1). « 1 » – непустая строка, но она не равна нулю. tput setaf 1 ; echo $? покажет вам, каков на самом деле код, который вы могли бы затем исследовать дальше.