Nous savons que ~
et $HOME
font référence au répertoire de base de l'utilisateur actuel. (Pour moi, echo ~
= echo $HOME
= pandya
name__).
Mais je ne peux pas l'utiliser dans les scripts bash. Voici un exemple de script simple:
#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
cd $dir1
Mais lorsqu’il est exécuté, cela donne l’erreur No such file or directory
comme suit:
$ ./script
Enter Directory Path:~/Desktop
./script: line 4: cd: ~/Desktop: No such file or directory
Si /home/pandya
a été utilisé au lieu de ~
, cela fonctionne.
Même problème avec $HOME
.
Ainsi, comment utiliser correctement cd
avec ~
ou $HOME
dans un tel script bash?
Vous pouvez résoudre ce problème en utilisant la commande eval :
#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
eval cd "$dir1"
Parce que dans votre code, $dir1
ne stockera pas ~/Desktop
mais il stockera /home/user/Desktop
afin que vous puissiez utiliser la commande eval.
Pour comprendre Eval commande Ici
Voici un exemple qui fonctionne.
Comme indiqué précédemment, le développement des variables à partir des entrées est la clé.
#!/bin/bash
echo -n "Dir:"
read dir1
dir2=`eval echo $dir1`
cd $dir2
pwd
Bien sûr, vous ne devez pas vous attendre à ce que votre Shell actuel change de répertoire de travail après l'exécution du script. Il restera inchangé.
Le problème est que le développement du tilde se produit avant le développement de la variable (voir man bash
pour plus de détails). L'extension de variable se produit une seule fois, donc $dir1
est développé, mais la chaîne $HOME
qu'il contient ne l'est pas.
Il serait peut-être plus facile de spécifier le chemin du répertoire en tant qu'argument de ligne de commande au lieu d'utiliser read
pour le lire à partir de la console: le shell le développera pour vous:
#!/bin/bash
dir1=$1
cd "$dir1"
pwd
et l'appelle comme
./script ~/Desktop
Une autre alternative consiste à utiliser une boîte de dialogue de fichier au lieu de taper le chemin du tout:
dialog --dselect / 20 20