Comando de teste: teste legível falha

Comando de teste: teste legível falha

Eu tenho uma pasta e um arquivo no meu diretório pessoal com esta estrutura: ~/folder/file.

Tanto a pasta quanto o arquivo obtiveram permissões totais para mim (a pasta é 700, o arquivo é 600). O seguinte comando de teste (está dentro de um script de shell, se isso for importante) retorna inesperadamente (imo) falso.

[ -r ~/folder/file ]
echo $? #Prints 1->Failure

No entanto, se eu usar um caminho alternativo para o arquivo como

pwd #Prints /home/myname
[ -r /home/myname/folder/file ]
[ -r folder/file ]
echo $? #Prints 0->Success

Estou esquecendo de algo?

test -rretorna verdadeiro se FILEexistir e a permissão de leitura for concedida de acordo com man test.

Responder1

Afinal, encontrei meu problema. O problema é que eu estava lendo o caminho do teclado (comando de leitura) e de alguma forma o til (~) não estava se expandindo.

echo 'Give path:'
read var1
var2=$(eval echo "$var1");

Agora var2 contém o caminho completo (expandindo ~) e eu poderia usar meus testes normalmente depois disso.

Responder2

Para complementarResposta do Alator, deve-se notar queExpansão Tilé realizado apenas nestes casos:

  • Atribuição de variável, sem aspas ~imediatamente após :, como emmypath=~/Documents:~/usr/share/stuff
  • Atribuição de variável após first =, ~sem aspas, como emfoo=~/bar
  • Início de uma "palavra":~/ascript.sh
  • "Palavra" separada:stat ~/afile.txt

readpega a sequência literal de caracteres stdine não executa a expansão do Til; mais importante ainda, a expansão do Tilde é executada pelo próprio shell e não por seus comandos internos individuais.

Uma maneira de lidar com isso poderia ser evalcomo o Alator mostrou, ou pode-se fazer uso da substituição de parâmetros (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 se tiver que lidar com essas linguagens específicas), 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"

informação relacionada