Пустая функция в BASH
Я использую инструмент FPM для создания пакета.deb. Этот инструмент создает до / после удаления пакета из поддерживаемых файлов.
К сожалению, скрипт bash, сгенерированный FPM, содержит такую функцию
dummy() {
}
И этот скрипт завершается с ошибкой:
Синтаксическая ошибка, неожиданно
Разве BASH не позволяет пустые функции? Какая версия bash/linux имеет это ограничение?
5 ответов
Вы могли бы использовать :
это эквивалентно true
и в основном используется как оператор ничего не делать...
dummy(){
:
}
Один лайнер
dummy(){ :; }
:
это нулевая команда
;
нужен в формате одной строки
Пустая функция bash может быть недопустимой. Функция, содержащая только комментарии, также будет считаться пустой.
":" (нулевая команда) может быть помещена в функцию, если вы хотите "НЕ НИЧЕГО"
Я рекомендую это:
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