Ocorre um problema usando o comando cd com “~” ou “$ HOME” no bash scripting

3

Sabemos que ~ e $HOME referem-se ao diretório inicial do usuário atual. (Para mim, echo ~ = echo $HOME = pandya ).

Mas não posso usá-lo no script do bash. Aqui está um exemplo simples de script:

#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
cd $dir1

Mas quando executado, dá erro No such file or directory da seguinte forma:

$ ./script
Enter Directory Path:~/Desktop
./script: line 4: cd: ~/Desktop: No such file or directory

Se /home/pandya foi usado em vez de ~ , então está funcionando.

O mesmo problema com $HOME .

Assim, como usar corretamente cd com ~ ou $HOME nesse script bash?

    
por Pandya 12.08.2014 / 12:17

3 respostas

3

Você pode resolver esse problema usando o comando eval :

#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
eval cd "$dir1"

Porque no seu código $dir1 não armazenará ~/Desktop , mas armazenará /home/user/Desktop , para que você possa usar o comando eval.

Para entender o comando Eval Aqui

    
por nux 12.08.2014 / 12:40
3

Veja um exemplo que funciona.

Como dito anteriormente, a expansão das variáveis da entrada é a chave.

#!/bin/bash
echo -n "Dir:"
read dir1
dir2='eval echo $dir1'
cd $dir2
pwd

Naturalmente, você não deve esperar que seu shell atual altere seu diretório de trabalho após a execução do script. Ele permanecerá inalterado.

    
por Run CMD 12.08.2014 / 12:43
2

O problema é que a expansão do til acontece antes da expansão da variável (veja man bash para detalhes). A expansão da variável acontece apenas uma vez, então $dir1 é expandido, mas a string $HOME dentro dela não é.

Pode ser mais fácil especificar o caminho do diretório como um argumento de linha de comando, em vez de usar read para lê-lo no console: o shell expandirá para você:

#!/bin/bash
dir1=
cd "$dir1"
pwd

e chame como

./script ~/Desktop

Outra alternativa é usar um diálogo de arquivo em vez de digitar o caminho:

dialog --dselect / 20 20
    
por choroba 12.08.2014 / 12:27