Compruebe si el directorio existe utilizando el carácter de inicio (~) en bash falla

16

¿Por qué bashverifica lo siguiente si falla un directorio?

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

~/DesktopDe hecho existe. Esto está en una Mac por cierto.


El problema es con este tipo de script

read -p "Provide the destination directory: " DESTINATION

if [ ! -d $DESTINATION ]; then
    echo "\t'$DESTINATION' does not exist." >&2;
    exit 1;
fi
Justin
fuente
1
Al igual que cuando lo haces 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 no a="~/Desktop"; cd Desktop;Ver serverfault.com/questions/417252/…
dylnmc

Respuestas:

7

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:

Noach Magedman
fuente
23

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.
quanta
fuente
¿Qué tal si el valor viene dinámicamente? Es decir ( pastie.org/4471350 ) y DESTINATIONes ~/Desktop.
Justin
3
La expansión de Tilde se realiza cuando se establece la variable, no cuando se evalúa, por lo que no es un buen ejemplo.
MadHatter
+1, esto es suficiente para resolver mi problema.
Flying Fisher
1

correr

echo $HOME

use $HOME, y asegúrese de que el usuario esté usando el script. si root usa ~va a mirar adentro /root, no /home/$USER.

if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi
tres seises
fuente
-1
if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

debería ser $ HOME en lugar de ~

~ es una cosa de TECLADO

LeoChu
fuente
Si lees la otra respuesta aquí, te darás cuenta de que esto está mal.
pollitos de