3

У меня есть следующие переменные в моем .bashrc:

export UPRODUCT=productName
export U=/path/to/products/$UPRODUCT

Поэтому, набрав cd $ U, вы попадете в /path /to /products /productName.

Что я хочу сделать, это в моей оболочке

export UPRODUCT=otherProductName
cd $U

и быть перенесены в /path /to /products /otherProductName без переопределения $ U. Это возможно?

5 ответов5

4

Да с функцией

cdu() { cd /path/to/products/$UPRODUCT ;}

вы вводите cdu и он изменится в каталоге $U Я называю это cdu но вы можете выбрать имя, которое вы предпочитаете.
Вопрос в том, что при первом export в .bashrc он увеличивает значение, известное в тот момент.

2

Добавьте это к вашему ~/.bashrc:

alias mycd='export U=/path/to/products/$UPRODUCT; cd'

и используйте это так:

export UPRODUCT=otherProductName
mycd $U
1

Вы можете использовать небольшой скрипт для этого, чтобы сделать все это одной командой.

Что-то вроде этого:

 ## script must take one argument
 ## the argument will be the otherProductName

 if test "$1" != ''
  then
   echo changing $UPRODUCT to $1 #Using the argument for new name
   export UPRODUCT=$1 #exporting that variable
   ## CHANGE /path/to/products/ to your actual path!!!
   export U=/path/to/products/$UPRODUCT #changing U to new path
   echo new UPRODUCT is: $UPRODUCT #displaying new variables
   echo new U is: $U
   if [ ! -d $U ]  #if new product doesn't exist as directory
    then
     echo $U not found
     exit
    else
     cd $U  # cd to new directory
   fi
 exit
 else
  echo 'USAGE: change_path.sh [newProductName]' # prompt for new name
 fi

Создайте новый файл с именем change_path.sh (или как хотите) и дайте ему права на выполнение.

chmod 755 change_path.sh

Затем, когда вы хотите изменить UPRODUCT, просто запустите этот файл

./change_path.sh [otherProductName]

1

Прямой ответ: Нет, невозможно сохранить нерасширенную ссылку в переменной, которая будет раскрыта при ее использовании. Расширения оболочки происходят сразу после токенизации, в том числе для назначения переменных, и расширение параметров не включает сам рекурсивный шаг расширения.

edit, согласно Кевину: Обратите внимание, однако, что могут произойти другие расширения ПОСЛЕ расширения параметров оболочки (включая расширение имени файла). Это не допускает двойного косвенного обращения, но может использоваться для расширения подстановочных знаков в имени без кавычек.

Используйте один из других ответов на странице для эквивалентного поведения.

1

Если вы хотите использовать eval (и я надеюсь, что нет), то вы можете сделать это:

export UPRODUCT=productName
export U=/path/to/products/\$UPRODUCT

export UPRODUCT=otherProductName
eval cd $U

Обратите внимание на \ before $ в определении переменной U

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .