Saltar al contenido

Verificar si el directorio existe usando el carácter de inicio (~) en bash falla

Hola, tenemos la solución a lo que necesitas, desplázate y la hallarás más abajo.

Solución:

Solución 1:

Elimine las comillas dobles alrededor del directorio para ver si funciona:

if [ ! -d ~/Desktop ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

La razón de esto es que la expansión de tilde solo funciona cuando no está entre comillas.

info "(bash) Tilde Expansion"

3.5.2 Tilde Expansion
---------------------

If a word begins with an unquoted tilde character (`~'), all of the
characters up to the first unquoted slash (or all characters, if there
is no unquoted slash) are considered a TILDE-PREFIX.  If none of the
characters in the tilde-prefix are quoted, the characters in the
tilde-prefix following the tilde are treated as a possible LOGIN NAME.
If this login name is the null string, the tilde is replaced with the
value of the `HOME' shell variable.  If `HOME' is unset, the home
directory of the user executing the shell is substituted instead.
Otherwise, the tilde-prefix is replaced with the home directory
associated with the specified login name.

Solución 2:

Justin aclaró su pregunta en su primer comentario sobre la respuesta de quanta. Él está leyendo en una línea de texto usando read (o por algún otro medio dinámico) y quiere expandir la tilde.

La pregunta se convierte en “¿Cómo se realiza la expansión de tilde en el contenido de una variable?”

El enfoque general es utilizar evalpero viene con algunas advertencias importantes, a saber, espacios y redirección de salida (>) en la variable. Lo siguiente parece funcionar para mí:

read -p "Provide the destination directory: " DESTINATION

if [ ! -d "`eval echo $DESTINATION//>`" ]; then
    echo "'$DESTINATION' does not exist." >&2;
    exit 1;
fi

Pruébelo con cada una de las siguientes entradas:

~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again

Explicación

  • los $mypath//> se desnuda > caracteres que podrían destruir un archivo durante la eval.
  • los eval echo ... es lo que significa la expansión real de la tilde
  • Las comillas dobles alrededor del eval son para soporte de nombres de archivo con espacios.

Como complemento a esto, puede mejorar la UX agregando el -e opcion de leer:

read -p "Provide the destination directory: " -e DESTINATION

Ahora, cuando el usuario escriba tilde y presione la pestaña, se expandirá. Este enfoque no reemplazar Sin embargo, el enfoque eval anterior, ya que la expansión solo ocurre si el usuario presiona la pestaña. Si solo escribe ~/foo y presiona enter, permanecerá como una tilde.

Ver también:

  • https://stackoverflow.com/questions/3963716/how-to-manually-expand-a-special-variable-ex-tilde-in-bash

Solución 3:

No funciona no solo en Mac sino en cualquier plataforma en la que se ejecute bash.

Cuando cita “~/Desktop”, le está diciendo a bash que busque Desktop dentro de la carpeta ~. La cita elimina el propósito especial de ~

Ver — http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion

Elimina las comillas dobles y debería funcionar.

Acuérdate de que tienes la opción de valorar este tutorial si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *