#bash #export #alias
#bash #экспорт #псевдоним
Вопрос:
Я пытаюсь установить переменную env, которую я могу использовать для создания относительных цепочек каталогов. Я пытаюсь сделать это следующим образом, но не могу заставить его работать. Как мне это сделать?
alias sroot="export SROOT="$PWD""
alias drumit="cd $SROOT/abc/def/drumit"
Если я набираю sroot, он принимает псевдоним, но когда я набираю drumit, он выдает сообщение об ошибке
bash: cd: /abc/def/drumit: No such file or directory
Похоже, что при запуске оболочки она принимает $SROOT
вид .
Ценю любую помощь.
Спасибо
Комментарии:
1. Знаете ли вы о
pushd
popd
встроенных и? Вы можете создать свои псевдонимы из них.
Ответ №1:
Ваши переменные $ PWD и $ SROOT расширяются во время определения псевдонимов, а не когда вы их используете. Поместите перед ними, чтобы избежать их, пока они определены.
alias sroot="export SROOT="$PWD""
alias drumit="cd $SROOT/abc/def/drumit"
Комментарии:
1. Кстати, я не понимаю, как здесь может помочь escape-последовательность. Но это произошло. Не могли бы вы немного объяснить? Спасибо
2. Это решение работало для zsh, работающего под управлением Oh-my-zshell в iTerm2.lol
Ответ №2:
Когда вы изначально задаете псевдоним, он расширяется $PWD
вместо сохранения его как переменной формы. Попробуйте использовать function
вместо этого вот так:
$ function sroot {
> export SROOT="$PWD"
> }
$ export -f sroot
$ function drumit {
> cd $SROOT/cron
> }
$ export -f drumit
$ declare -f sroot
sroot()
{
export SROOT="$PWD"
}
$ declare -f drumit
drumit ()
{
cd $SROOT/abc/def/drumit
}
Это то, что в настоящее время происходит, когда вы используете псевдоним, как в вашем вопросе (расширение переменной):
$ alias sroot="export SROOT="$PWD""
$ alias drumit="cd $SROOT/abc/def/drumit"
$ alias
alias SROOT='/home/jon'
alias drumit='cd /home/jon/abc/def/drumit'
alias sroot='export SROOT=/home/jon'
Экранирование тоже сработает:
$ alias sroot="export SROOT="$PWD""
$ alias drumit="cd $SROOT/abc/def/drumit"
$ alias
alias drumit='cd $SROOT/abc/def/drumit'
alias sroot='export SROOT=$PWD'