Para complementar a resposta do Alator , deve-se notar que Expansão do Tilde é executada apenas nestes casos:
- Atribuição de variável, sem aspas
~
imediatamente após:
, como emmypath=~/Documents:~/usr/share/stuff
- Atribuição variável após o primeiro
=
,~
não citado, como emfoo=~/bar
- Início de uma "palavra":
~/ascript.sh
- Separe "palavra":
stat ~/afile.txt
read
recebe seqüência literal de caracteres de stdin
e não executa Expansão de til; mais importante, a Expansão de Tilde é executada pela própria shell e não por seus comandos internos individuais.
Uma maneira de lidar com isso pode ser via eval
, como o Alator mostrou, ou pode-se fazer uso de substituição de parâmetro (que tecnicamente é apenas uma maneira manual de fazer exatamente a mesma coisa):
~$ echo "${foo/\~/$HOME}"
/home/username/Documents
Alternativamente, se você não se importa em iniciar outro processo (ou você tem que lidar com esses idiomas em particular) você pode usar Python e Perl da seguinte forma:
python -c 'import sys,os; print os.path.expanduser(sys.argv[1])' "$foo"
perl -e 'print glob qq("$ARGV[0]")' "$foo" "$foo"