Я настраиваю среду оболочки и хочу иметь возможность использовать некоторые из тех же функций / псевдонимов в zsh, что и в bash. Одна из этих функций открывает в редакторе .bashr c или .zshr c (в зависимости от файла), ожидает закрытия редактора, а затем перезагружает файл r c.
# a very simplified version of this function
editrc() {
local rcfile=".$(basename $SHELL)rc"
code -w ~/$rcfile
. ~/$rcfile
}
Я использую значение rcfile
в нескольких других функциях, поэтому я вытащил его из объявления функции.
_rc=".$(basename $SHELL)rc"
editrc() {
code -w ~/$_rc
. ~/$_rc
}
# ... other functions that use it ...
unset _rc
Однако, поскольку я аккуратный урод, я хочу unset _rc
в конце моего скрипта, но я все же хочу, чтобы мои функции работали правильно. Есть ли умный способ оценить $_rc
во время объявления функции?
Я знаю, что могу использовать eval
и поместить все, кроме $_rc
экземпляров, в одинарные кавычки, но это похоже на боль , поскольку в полной версии моей функции используются как одинарные, так и двойные кавычки.
_rc=".$(basename $SHELL)rc"
eval 'editrc() {
echo Here'"'"'s a thing that uses single quotes. As you can see it'"'"'s a pain.
code -w ~/'$_rc'
. ~/'$_rc'
}'
# ... other functions using `_rc`
unset _rc
Думаю, я мог бы объявить свои функции, а затем сделать несколько магов c с eval "$(declare -f editrc | awk)"
. Конечно, это будет больше боли, чем оно того стоит, но я всегда заинтересован в изучении нового.
Примечание: я бы хотел обобщить это в служебную функцию, которая делает это.
_myvar=foo
anothervar=bar
myfunc() {
echo $_myvar $anothervar
}
# redeclares myfunc with `$_myvar` expanded, but leaves `$anothervar` as-is
expandfunctionvars myfunc '$_myvar'