~
é um atalho para o seu diretório pessoal, mas apenas quando aparece no início de uma string entre aspas externas . O início do lado direito de um operador de atribuição é o começo de uma string, então env1=~/Dropbox/.env
funcionaria (ou env1=~"/Dropbox/.env"
ou qualquer número de variações). Define env1
para /home/roach/Dropbox/.env
. Mas env1="~/Dropbox/.env"
define env1
para a exata string ~/Dropbox/.env
, que como um nome de arquivo procura dentro de um diretório com o nome de um caractere ~
no diretório atual.
til é uma abreviação, não um curinga. $env1
fora de aspas expande curingas no valor de env1
, mas não expande o til porque o til não é um caractere curinga.
Você também pode usar env1="$HOME/Dropbox/.env"
. Isso é equivalente a env1=~/Dropbox/.env
. O caractere $
(dólar) tem um significado especial entre aspas duplas (é o mesmo significado que as aspas externas): ele inicia uma substituição de variável (ou um comando ou uma substituição aritmética). O caractere ~
(til), por outro lado, é apenas um caractere comum quando está entre aspas, até mesmo aspas duplas.
Quanto ao alias, o motivo pelo qual ele não funciona em um script bash é que o bash não expande aliases em scripts por padrão. Ele não funcionará em nenhum script, a menos que você inclua ou forneça a definição do alias nesse script, já que os aliases são uma propriedade de cada instância do shell. Eles não fazem parte do ambiente de um processo.
O motivo pelo qual o alias funciona em seu segundo script é que o próprio dotdrop expande o til quando lê seu valor de configuração.