Comando de prueba: la prueba legible falla

Comando de prueba: la prueba legible falla

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 -rdevuelve verdadero si FILEexiste 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

readtoma una secuencia literal de caracteres stdiny 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 evalcomo 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"

información relacionada