If и вызывающей функции, если используется bash

Я написал функцию:

check_log(){
    if [ -f "/usr/apps/appcheck.log" ]
    then
         return 1
    else
         return 0
    fi
}

Затем я вызываю эту функцию в условии "если":

if [ check_log ];
then
    ........statements....
fi

Будет ли это работать? Я смущен здесь, потому что Баш возвращает 0 в случае успеха и 1 в случае неудачи, но моя функция возвращает 1 и условие проверки на 1/0, он получает 1, и она должна давать сбои, но в моем сценарии оболочки состояние проходит.

Кто-нибудь может пролить свет на этот вопрос?

Ответы

Ответ 1

if [ check_log ];

При использовании квадратных скобок вы вызываете команду test. Это эквивалентно if test check_log, который является сокращением для if test -n check_log, что, в свою очередь, означает "если "check_log" не является пустой строкой". Он вообще не вызывает вашу функцию check_log.

Измените его так:

if check_log;

Кстати, эту функцию можно было бы просто написать следующим образом:

check_log() {
    ! [ -f "/usr/apps/appcheck.log" ]
}

Возвращаемое значение функции - это статус выхода последней команды, поэтому нет необходимости в явных операторах возврата.

Ответ 2

Как отмечено @john-kugelman, одним из решений (и, возможно, самым правильным) является использование следующего синтаксиса:

if check_log;

Но альтернативное решение:

if [[ $(check_log; echo $?) -eq 0 ]];

Мое личное предпочтение - последнее, поскольку оно способствует согласованности условных утверждений. Но недостатком является то, что, потому что он полагается на подстановку команд, он перекроет дочерний процесс (т.е. Подоболочку), где в качестве первого метода не будет.

Интересное чтение по этому вопросу можно найти здесь:

Когда подстановка команд порождает больше подоболочек, чем те же команды в отдельности?

Обновлено (2017-10-20): вычеркнуть мое предпочтение второму методу, так как в эти дни я нахожусь в миссии, чтобы предотвратить ненужное форкирование. Синтаксис в первом решении не так интуитивен для программирования без оболочки, но он, безусловно, более эффективен.