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 usar 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
- La
${mypath//>}excluye los >caracteres que podrían Clobber un archivo durante el eval.
- Esto
eval echo ...es lo que hace la expansión tilde real
- Las comillas dobles alrededor de
evalson para el soporte de nombres de archivos con espacios.
Como complemento de esto, puede mejorar la experiencia de usuario agregando la -eopción de leer:
read -p "Provide the destination directory: " -e DESTINATION
Ahora, cuando el usuario escriba tilde y presione la pestaña, se expandirá. Sin embargo, este enfoque no reemplaza el enfoque de evaluación anterior, ya que la expansión solo ocurre si el usuario toca la pestaña. Si solo escribe ~ / foo y pulsa enter, permanecerá como una tilde.
Ver también:
cd "~/Desktop", también obtienes un error. Tiene que estar sin comillas o almacenado como una variable (sin comillas). Por ejemplo,a=~/Desktop; cd $a;funciona pero noa="~/Desktop"; cd Desktop;Ver serverfault.com/questions/417252/…