Пустая функция в BASH

Я использую инструмент FPM для создания пакета.deb. Этот инструмент создает до / после удаления пакета из поддерживаемых файлов.

К сожалению, скрипт bash, сгенерированный FPM, содержит такую ​​функцию

dummy() {
}

И этот скрипт завершается с ошибкой:

Синтаксическая ошибка, неожиданно

Разве BASH не позволяет пустые функции? Какая версия bash/linux имеет это ограничение?

5 ответов

Вы могли бы использовать : это эквивалентно true и в основном используется как оператор ничего не делать...

dummy(){
     : 
  }

Один лайнер

dummy(){ :; }


: это нулевая команда

; нужен в формате одной строки

Пустая функция bash может быть недопустимой. Функция, содержащая только комментарии, также будет считаться пустой.

":" (нулевая команда) может быть помещена в функцию, если вы хотите "НЕ НИЧЕГО"

см.: http://tldp.org/LDP/abs/html/functions.html

Я рекомендую это:

dummy(){ unused(){ :;} }


Если вы используете : пустая команда, она будет напечатана с помощью опции xtrace:

(
    set -o xtrace
    dummy(){ :; }
    dummy "null command"
)

echo ------

(
    set -o xtrace
    dummy(){ unused(){ :;} }
    dummy "unused function"
)

выход:

+ dummy 'null command'
+ :
------
+ dummy 'unused function'

Для отладки я использую обертку так:

main() {(
    pwd # doing something in subshell
)}

print_and_run() {
    clear
    (
        eval "$1() { unused() { :; } }"
        set -o xtrace
        "$@"        
    )
    time "$@"
}

print_and_run main aaa "bb bb" ccc "ddd"
# output:
# + main aaa 'bb bb' ccc ddd
# ..
      dummy_success(){ true; } #always returns 0
dummy_fail(){ false; }   #always returns 1

минимальные функции, всегда возвращающие статус OK или ERROR..

также полезно переопределить отсутствующие функции с пустой функцией (или обновить ее с помощью какого-либо действия по умолчанию, например - предупреждения об отладке):

      #!/bin/sh
#avoid error if calling unimportant_func which is underfined
declare -F unimportant_func >/dev/null || unimportant_func() { true; }
    
#get error if calling important_func which is underfined
declare -F important_func >/dev/null || important_func() { false; }

# print debug assert if function not exists
declare -F some_func >/dev/null || some_func() {
    echo "assert: '${FUNCNAME[0]}() is not defined. called from ${BASH_SOURCE[1]##*/}[${BASH_LINENO[0]}]:${FUNCNAME[1]}($@)" 1>&2; }


my_func(){
    echo $(some_func a1 a2 a3)
    important_func   && echo "important_func ok"   || echo "important_func error"
    unimportant_func && echo "unimportant_func ok" || echo "unimportant_func error"
}

my_func

выход:

      $> testlib.sh
assert: 'some_func() is not defined. called from testlib.sh[15]:my_func(a1 a2 a3)

important_func error
unimportant_func ok
Другие вопросы по тегам