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 eval
pero 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 laeval
. - 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.