
Estou escrevendo um script bash e nele estou fazendo algo parecido com o seguinte:
#!/bin/sh
read -p "Enter target directory: " target_dir
cp some/file.txt $target_dir/exists/for/sure/
Quando executo este script de shell, vejo e insiro:
./my_script.sh
Enter target directory: ~/my_dir
Mas recebo o erro/saída:
cp: directory ~/my_dir/exists/for/sure/ does not exist
E, como estou tentando deixar óbvio: esse diretório existe 100%. ou seja, posso executar o seguinte sem receber nenhum erro:
cd ~/my_dir/exists/for/sure/
O que está acontecendo aqui?
Responder1
O problema é que isso ~
é interpretado literalmente e não expandido quando você digita como entrada para read
.
Teste-o:
$ read target
~
$ ls $target
ls: cannot access '~': No such file or directory
(observe as aspas ao redor ~
)
eval target=$target # unsafe
ou melhor, mas expande apenas ~
:
target="${target/#\~/$HOME}"
ou melhor ainda, não digite variáveis ou algo semelhante read
em primeiro lugar.