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:
read -p "Provide the destination directory: " DESTINATION
if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
echo "'$DESTINATION' does not exist." >&2;
exit 1;
fi
Essayez-le avec chacune des entrées suivantes:
~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again
Explication
- Le
${mypath//>}
supprime les >
caractères qui pourraient encombrer un fichier pendant le eval
.
- C'est
eval echo ...
ce que fait l'expansion réelle du tilde
- Les guillemets doubles autour du
eval
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:
read -p "Provide the destination directory: " -e DESTINATION
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:
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/…