Obtuve una carpeta y un archivo en mi directorio de inicio con esta estructura: ~/folder/file
.
Tanto la carpeta como el archivo obtuvieron permisos completos para mí (la carpeta es 700, el archivo es 600). El siguiente comando de prueba (está dentro de un script de shell si eso importa) devuelve inesperadamente (en mi opinión) falso.
[ -r ~/folder/file ]
echo $? #Prints 1->Failure
Sin embargo, si uso una ruta alternativa al archivo como
pwd #Prints /home/myname
[ -r /home/myname/folder/file ]
[ -r folder/file ]
echo $? #Prints 0->Success
¿Me estoy perdiendo de algo?
test -r
devuelve verdadero si FILE
existe y se otorga permiso de lectura de acuerdo con
man test
.
Respuesta1
Después de todo, encontré mi problema. La cuestión es que estaba leyendo la ruta desde el teclado (comando de lectura) y de alguna manera la tilde (~) no se expandía. La solución a esto fue:
echo 'Give path:'
read var1
var2=$(eval echo "$var1");
Ahora var2 contiene la ruta completa (expandiendo ~) y podría usar mis pruebas normalmente después de eso.
Respuesta2
Para suplementarLa respuesta de Alator, se debe notar queExpansión de tildese realiza sólo en estos casos:
- Asignación de variable, sin comillas
~
inmediatamente después:
, como enmypath=~/Documents:~/usr/share/stuff
- Asignación de variable después del primero
=
,~
sin comillas, como enfoo=~/bar
- Principio de una "palabra":
~/ascript.sh
- Separar "palabra":
stat ~/afile.txt
read
toma una secuencia literal de caracteres stdin
y no realiza Tilde Expansion; Más importante aún, Tilde Expansion la realiza el propio shell, no sus comandos integrados individuales.
Una forma de solucionar esto podría ser eval
como lo mostró Alator, o se podría hacer uso de la sustitución de parámetros (que técnicamente es solo una forma manual de hacer exactamente lo mismo):
~$ echo "${foo/\~/$HOME}"
/home/username/Documents
Alternativamente, si no te importa iniciar otro proceso (o tienes que lidiar con esos lenguajes en particular), puedes usar Python y Perl de esta manera:
python -c 'import sys,os; print os.path.expanduser(sys.argv[1])' "$foo"
perl -e 'print glob qq("$ARGV[0]")' "$foo" "$foo"