bash mantém a referência de variável em outra variável

3

Eu tenho as seguintes variáveis no meu .bashrc:

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

Então digitar cd $ U me levará para / path / to / products / productName.

O que eu quero fazer é, no meu shell

export UPRODUCT=otherProductName
cd $U

e ser levado para / path / to / products / otherProductName, sem redefinir $ U. Isso é possível?

    
por Nick 08.07.2015 / 19:38

5 respostas

1

Resposta direta: Não, não é possível salvar uma referência não expandida em uma variável que será expandida quando a variável for usada. Expansões da shell ocorrem imediatamente após a tokenização, incluindo a atribuição de variáveis, e a expansão de parâmetro não inclui uma etapa de expansão recursiva em si .

editar, por Kevin: Note, no entanto, que outras expansões podem ocorrer após a expansão dos parâmetros do shell (incluindo a expansão do nome do arquivo). Isso não permite a dupla indireção, mas pode ser usado para expandir os curingas de nome de arquivo sem nome.

Use uma das outras respostas na página para um comportamento equivalente.

    
por 08.07.2015 / 21:32
4

Sim com uma função

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

você digita cdu e ele será alterado no diretório $U . Eu chamo de cdu mas você pode escolher o nome que preferir.
A questão é que, quando você export a primeira vez no .bashrc , expande o valor conhecido no momento.

    
por 08.07.2015 / 20:11
2

Adicione isto ao seu ~ / .bashrc:

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

e use desta forma:

export UPRODUCT=otherProductName
mycd $U
    
por 08.07.2015 / 20:14
1

Você pode usar um script pequeno para fazer tudo com um único comando.

Algo parecido com isto:

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

Crie um novo arquivo chamado change_path.sh (ou o que você quiser) e dê a ele permissões executáveis.

chmod 755 change_path.sh

Então, quando você quiser alterar o UPRODUCT, basta executar esse arquivo

./change_path.sh [otherProductName]

    
por 08.07.2015 / 20:41
1

Se você estiver disposto a usar eval (e espero que não seja) , poderá fazer isso:

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

export UPRODUCT=otherProductName
eval cd $U

Observe o \ antes do $ na definição da variável U .

    
por 09.07.2015 / 00:00