Comando de teste: teste legível falha

0

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

A pasta e o arquivo receberam permissões completas para mim (a pasta é 700, o arquivo é 600). O seguinte comando de teste (dentro de um script de shell, se isso for importante) retorna inesperadamente (imo) false.

[ -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 sentindo falta de algo?

test -r retornará verdadeiro se FILE existir e a permissão de leitura for concedida de acordo com man test .

    
por Alator. 23.03.2018 / 23:29

2 respostas

0

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 em mypath=~/Documents:~/usr/share/stuff
  • Atribuição variável após o primeiro = , ~ não citado, como em foo=~/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"
    
por Sergiy Kolodyazhnyy 25.03.2018 / 23:24
0

Eu encontrei o meu problema depois de tudo.A coisa é que eu estava lendo o caminho do teclado (comando de leitura) e de alguma forma o til (~) não estava expandindo.Solução para isso foi:

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

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

    
por Alator. 24.03.2018 / 13:56