Pourquoi les éléments suivants bash
vérifient-ils si un répertoire échoue?
if [ ! -d "~/Desktop" ]; then
echo "DOES NOT EXIST"
exit 1;
fi
~/Desktop
existe bel et bien. C'est d'ailleurs sur un Mac.
Le problème est avec ce type de script
read -p "Provide the destination directory: " DESTINATION
if [ ! -d $DESTINATION ]; then
echo "\t'$DESTINATION' does not exist." >&2;
exit 1;
fi
cd "~/Desktop"
vous obtenez également une erreur. Il doit être non cité ou stocké sous forme de variable (sans guillemets). Par exemple,a=~/Desktop; cd $a;
fonctionne mais pasa="~/Desktop"; cd Desktop;
Voir serverfault.com/questions/417252/…Réponses:
Justin a clarifié sa question dans son premier commentaire sur la réponse de quanta. Il lit dans une ligne de texte en utilisant
read
(ou par un autre moyen dynamique) et souhaite développer le tilde.La question devient "Comment effectuez-vous l'expansion du tilde sur le contenu d'une variable?"
L'approche générale est à utiliser
eval
, mais elle comporte quelques mises en garde importantes, à savoir les espaces et la redirection de sortie (>
) dans la variable. Les éléments suivants semblent fonctionner pour moi:Essayez-le avec chacune des entrées suivantes:
Explication
${mypath//>}
supprime les>
caractères qui pourraient encombrer un fichier pendant leeval
.eval echo ...
ce que fait l'expansion réelle du tildeeval
sont pour la prise en charge des noms de fichiers avec des espaces.En complément de cela, vous pouvez améliorer l'UX en ajoutant l'
-e
option de lire:Maintenant, lorsque l'utilisateur tape tilde et frappe l'onglet, il se développera. Cependant, cette approche ne remplace pas l'approche eval ci-dessus, car l'expansion ne se produit que si l'utilisateur accède à l'onglet. S'il tape simplement ~ / foo et frappe enter, il restera comme un tilde.
Voir également:
la source
Supprimez les guillemets doubles dans le répertoire pour voir si cela fonctionne:
La raison en est que l'extension tilde ne fonctionne que lorsqu'elle n'est pas citée.
info "(bash) Tilde Expansion"
la source
DESTINATION
est~/Desktop
.Cela ne fonctionne pas seulement sur Mac mais sur toute plate-forme qui exécute bash.
Lorsque vous citez "~ / Desktop", vous dites à bash de rechercher Desktop dans le dossier ~. La citation supprime le but spécial de ~
Voir - http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion
Supprimez les guillemets doubles et cela devrait fonctionner.
la source
courir
utiliser
$HOME
et assurez-vous que l'utilisateur utilise réellement le script. si root utilise~
sa va chercher/root
, non/home/$USER
.la source
devrait être $ HOME au lieu de ~
~ est une chose CLAVIER
la source