Как создать псевдоним для экспорта в bash

#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'