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 -r
retorna verdadeiro se FILE
existir 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
read
pega a sequência literal de caracteres stdin
e 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 eval
como 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"