Я настраиваю свою среду оболочки и хочу иметь возможность использовать некоторые из тех же функций/псевдонимов в zsh, что и в bash. Одна из этих функций открывает .bashrc или .zshrc в редакторе (в зависимости от того, какой файл подходит), ждет закрытия редактора, а затем перезагружает rc-файл.
# 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
Однако, поскольку я фанат аккуратности, я хочу сбросить _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
Я предполагаю, что могу объявить свои функции, а затем поколдовать с 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'
SHELL
все равно будет установлено значение bash. Обходным путем было бы поместитьexport SHELL=/bin/zsh
в~/.zshenv
. - person user1934428   schedule 04.08.2020.zshenv
эквивалент bash? - person dx_over_dt   schedule 04.08.2020bash
автоматически устанавливает переменнуюSHELL
, если она еще не установлена, и вам не нужно заботиться о оболочках входа в систему bash. Для интерактивной подоболочки bash, запущенной из zsh, вы можете поместить определение в.bashrc
. Для неинтерактивного bash вам не повезло, но если вы пишете сценарий, вы знаете, какой язык используется, и можете явно установить переменную в сценарии. - person user1934428   schedule 05.08.2020