Verifique se o diretório existe usando o caractere inicial (~) no bash falha

13

Por que o seguinte bash verifica se um diretório falha?

if [ ! -d "~/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

~/Desktop existe de fato. Isso está em um Mac, a propósito.

O problema é com esse tipo de script

read -p "Provide the destination directory: " DESTINATION

if [ ! -d $DESTINATION ]; then
    echo "\t'$DESTINATION' does not exist." >&2;
    exit 1;
fi
    
por Justin 14.08.2012 / 06:57

5 respostas

7

Justin esclareceu sua pergunta em seu primeiro comentário sobre a resposta de quanta. Ele está lendo em uma linha de texto usando read (ou por outros meios dinâmicos) e quer expandir o til.

A pergunta se torna "Como você executa a expansão do til no conteúdo de uma variável?"

A abordagem geral é usar eval , mas ela vem com algumas advertências importantes, ou seja, espaços e redirecionamento de saída ( > ) na variável. O seguinte parece funcionar para mim:

read -p "Provide the destination directory: " DESTINATION

if [ ! -d "'eval echo ${DESTINATION//>}'" ]; then
    echo "'$DESTINATION' does not exist." >&2;
    exit 1;
fi

Experimente com cada uma das seguintes entradas:

~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again

Explicação

  • O ${mypath//>} remove caracteres > , o que poderia afetar um arquivo durante o eval .
  • O eval echo ... é o que faz a expansão real do til
  • As aspas duplas em torno do eval são para suporte de nomes de arquivos com espaços.

Como complemento, você pode melhorar o UX adicionando a opção -e para ler:

read -p "Provide the destination directory: " -e DESTINATION

Agora, quando o usuário digitar na guia til e hits, ele será expandido. Essa abordagem não substitui a abordagem de avaliação acima, no entanto, como a expansão só acontece se o usuário clicar na guia. Se ele apenas digitar ~ / foo e pressionar, ele permanecerá como til.

Veja também:

por 14.08.2012 / 11:43
21

Remova as aspas duplas em torno do diretório para ver se funciona:

if [ ! -d ~/Desktop ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

A razão para isso é que a expansão do til só funciona quando está sem aspas.

info "(bash) Tilde Expansion"

3.5.2 Tilde Expansion
---------------------

If a word begins with an unquoted tilde character ('~'), all of the
characters up to the first unquoted slash (or all characters, if there
is no unquoted slash) are considered a TILDE-PREFIX.  If none of the
characters in the tilde-prefix are quoted, the characters in the
tilde-prefix following the tilde are treated as a possible LOGIN NAME.
If this login name is the null string, the tilde is replaced with the
value of the 'HOME' shell variable.  If 'HOME' is unset, the home
directory of the user executing the shell is substituted instead.
Otherwise, the tilde-prefix is replaced with the home directory
associated with the specified login name.
    
por 14.08.2012 / 07:16
4

Não funciona não apenas no Mac, mas em qualquer plataforma que seja executada.

Quando você cita "~ / Desktop", está dizendo a você que procure Desktop dentro da pasta ~. A citação remove o propósito especial de ~

Veja - link

Remova as aspas duplas e isso deve funcionar.

    
por 14.08.2012 / 07:17
1

executar

echo $HOME

use $HOME e verifique se o usuário está realmente usando o script. se root usa ~ , ele vai procurar /root , não /home/$USER .

if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi
    
por 26.02.2013 / 18:23
-1
if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

deve ser $ HOME em vez de ~

~ é uma coisa do KEYBOARD

    
por 21.04.2017 / 12:57

Tags