В связи с this post on exiting a function in bashРекурсивная функция bash теряет способность возвращаться после спуска?
теряет ли рекурсивная функция Баш свою способность возвращаться после спуска?
Я попытался объяснить простой пример функции. Эта функция получает каталог и ищет файл .foo с базовым именем каталогов. Если этого не существует, его можно просто переименовать, но сначала нужно найти его. Я мог бы переписать это, конечно. Цикл поиска является причиной необходимости возврата. Мне просто интересно узнать о рекурсивном характере функций bash в этом случае.
given_directory=$"/home/bob"
some_function "$given_directory"
some_function() {
specific_foo_file=$"$1"/"$(basename "$1")".foo
if [ -f "$specific_foo_file" ] ; then
echo "do file stuff"
else
find . -name "*.foo"|while file ; do
if mv "$file" "$specific_foo_file" ; then
echo "renamed $file to $specific_foo_file"
some_function $given_directory
return 0
else
echo "could not rename $file"
return 1
fi
done
echo "can't find any .foo files, oh well"
fi
}
Пока эхо в конце всегда называется, если переименование было успешным.
EDIT: Для моего окружения я использую:
-bash-3.2$ uname -a
SunOS XXXXXXXXXX 5.10 Generic_150400-29 sun4v sparc SUNW,SPARC-Enterprise-T5120
Если вместо «return 0» вы указали только «return», вы бы получили необходимый эффект (так как функция по умолчанию заканчивается статусом выхода последней команды). –
Кроме того, запустите это через http://shellcheck.net/ и исправьте проблемы, которые он обнаруживает, поэтому нам не нужно описывать подробности. :) –
Не имеет значения, какой код возврата 'find | в то время как 'return с' echo "не может найти ..." 'code будет * always * run. Ничто не мешает этому. –