Resposta curta: veja BashFAQ # 050 ("Estou tentando colocar um comando em uma variável, mas o casos complexos sempre falham! ").
Resposta longa: quando o bash analisa um comando, ele analisa as cotações antes de substituir as variáveis; ele nunca volta e re-analisa as cotações nos valores das variáveis, então elas acabam não fazendo nada de útil. Usar echo para verificar o comando é completamente enganador porque mostra o comando após ter sido analisado; Se você quiser ver o que realmente está sendo executado, use set -x
para ter os comandos de impressão do shell à medida que são executados ou use printf "%q " $dir; echo
em vez de echo simples.
Se você quiser armazenar um comando complexo (isto é, um com espaços ou outros caracteres especiais nas "palavras"), será necessário colocá-lo em uma matriz em vez de uma variável de texto simples e, em seguida, expandi-lo com a expressão idiom ' "$ {array [@]}", assim:
dir=(cd "/cygdrive/c/Program Files/")
"${dir[@]}"
Agora, se o objetivo é fazer uma abreviação fácil de digitar, esse não é o caminho a seguir. Use um alias ou função do shell:
alias dir='cd "/cygdrive/c/Program Files/"'
dir
ou
dir() { cd "/cygdrive/c/Program Files/"; }
dir