Pourquoi la commande mkdir échoue avec: "Aucun fichier ou répertoire de ce type"?
#!/bin/bash
set -e
BIN_DIR="~/bin/"
if [ ! -d "$BIN_DIR" ]; then
mkdir "$BIN_DIR"
fi
Pourquoi la commande mkdir échoue avec: "Aucun fichier ou répertoire de ce type"?
#!/bin/bash
set -e
BIN_DIR="~/bin/"
if [ ! -d "$BIN_DIR" ]; then
mkdir "$BIN_DIR"
fi
Réponses:
Le message d'erreur est généré parce que le tilde
~
est cité, comme décrit dans la réponse de Zanna . Si vous souhaitez utiliser le~
, la partie pertinente du script doit être:Si pour une raison quelconque vous souhaitez citer la chaîne, vous pouvez utiliser la variable d'environnement
$HOME
:À mon avis, la deuxième approche est une meilleure pratique.
la source
~
scripts. cela fonctionne exactement de la même manière que dans la ligne de commande. Le problème est que la citation bloque l'expansion du tilde comme expliqué dans la réponse de Zanna .$HOME
scripts dans les scripts.$HOME
que d'utiliser l'extension tilde? La seule explication que vous avez donnée est de dire: "c'est une meilleure idée, car vous devriez faire moins attention". Je n'ai aucune idée de ce que ça veut dire. Pouvez-vous l'exposer dans un montage? Sans elle, rien ne vient étayer votre réponse, alors elle y appartient sûrement. L'expansion de Tilde est requise par POSIX depuis un certain temps maintenant et la ligne de hachage du script est#!/bin/bash
donc je suppose que la portabilité n'est pas la raison.Cela ne fonctionne pas car
~
est cité. Les guillemets doubles"
suppriment l' expansion du tilde . Il n'y a pas de répertoire avec le nom littéral~/bin
. Comme expliqué dansman bash
(souligné par moi):Vous pouvez supprimer les guillemets , car
~
c'est le seul caractère du chemin~/bin
qui fera que le shell effectuera une expansion, et nous voulons l'expansion dans ce cas. Le shell n'effectuera pas d'autres extensions sur le résultat de l'expansion de tilde, au moins dans Bash 4 , que toutes les versions actuelles ou à distance d'Ubuntu ont . Donc, même si votre répertoire personnel contient des caractères inhabituels comme des espaces, ce n'est pas grave.Ou vous pouvez utiliser à la
$HOME
place de~
, car l' expansion des paramètres n'est pas supprimée par des guillemets doubles, uniquement par des guillemets simples . Les guillemets doubles ne garantissent que la valeur étendue n'est pas elle - même soumise à des extensions supplémentaires, donc la séparation de mots ou extension de nom de fichier ne se produira pas. Fonctionne donc$HOME
même avec les répertoires de départ aux noms étranges, aussi longtemps que vous conservez les guillemets doubles.la source
cd '~'
is-bash: cd: ~: No such file or directory
.~
ne fait pas partie de l'expansion des paramètres.