Вы можете использовать простую функцию для удаленияlocal
-ness из переменной через unset
+set
:
function return_local()
{
unset $1 # must be local
eval "$1=\"\$2\""
}
Мы должны использовать eval
вместо declare
, потому что он создает либо локальную, либо экспортируемую переменную, когда нам нужно создать не локальную не экспортируемую переменную.
function test()
{
local my_return_value=123
#...
return_local my_return_value "$my_return_value"
}
Инструкция unset
удаляет самую внутреннюю local
переменную, поэтому вам нужно писать return_local
в каждой функции, которая хочет вернуть локальную переменную. Таким образом, return_local
можно использовать в контекстах вложенных вызовов.
И нет необходимости использовать оператор $(...)
, пока он создает отдельный процесс, который стоит производительности в bash под Windows, потому что создание процесса там недешево.
вы должны использовать -R или --рекурсивные, как предложено выше. но также вам может понадобиться изменить владение файлами/каталогами с помощью chown (и -R или --recursive )перед изменением разрешений, затем измените разрешения. также проверьте команду setacl/getacl для изменения разрешений.