¿Por qué falla el comando mkdir con: "No existe tal archivo o directorio"?
#!/bin/bash
set -e
BIN_DIR="~/bin/"
if [ ! -d "$BIN_DIR" ]; then
mkdir "$BIN_DIR"
fi
command-line
bash
scripts
home-directory
mkdir
Hendré
fuente
fuente
Respuestas:
El mensaje de error se produce porque
~
se cita la tilde , como se describe en la respuesta de Zanna . Si desea utilizar~
, la parte relevante del script debe ser:Si por alguna razón desea citar la cadena, puede usar la variable de entorno
$HOME
:En mi opinión, el segundo enfoque es una mejor práctica.
fuente
~
scripts. Funciona exactamente de la misma manera que en la línea de comandos. El problema es que los bloques de citas tienden a expandirse como se explica en la respuesta de Zanna .$HOME
scripts es una buena idea.$HOME
que usar la expansión tilde? La única explicación que ha dado es decir, "es una mejor idea, porque debería prestar menos atención". No tengo idea de lo que eso significa. ¿Puedes exponerlo en una edición? Sin ella, no hay nada que respalde su respuesta, por lo que seguramente pertenece a ella. POSIX ha requerido la expansión de Tilde desde hace bastante tiempo y la línea hashbang del script es#!/bin/bash
así que supongo que la portabilidad no es la razón.No funciona porque
~
se cita. Las comillas dobles"
suprimen la expansión de tilde . No hay directorio con el nombre literal~/bin
. Como se explica enman bash
(énfasis mío):Puede eliminar las comillas , ya que
~
es el único carácter en la ruta~/bin
que hará que el shell realice una expansión, y queremos la expansión en este caso. La cáscara no realizará ningún expansiones adicionales en el resultado de la expansión tilde, al menos en Bash 4 , que todas las versiones actuales o remotamente recientes de Ubuntu tienen . Entonces, incluso si su directorio de inicio contiene caracteres inusuales como espacios, está bien.O puede usar en
$HOME
lugar de~
, porque la expansión de parámetros no se suprime con comillas dobles, solo con comillas simples . Las comillas dobles no garantizan que el valor expandido en sí no es objeto de ningún expansiones adicionales, por lo que la división de palabras o la expansión de nombre de archivo no ocurrirán. También$HOME
funciona incluso con directorios de inicio con nombres extraños, siempre que mantenga las comillas dobles.fuente
cd '~'
es-bash: cd: ~: No such file or directory
.~
no es parte de la expansión de parámetros.