web-dev-qa-db-fra.com

Problème d'utilisation de la commande cd avec "~" ou "$ HOME" dans les scripts bash

Nous savons que ~ et $HOME font référence au répertoire de base de l'utilisateur actuel. (Pour moi, echo ~ = echo $HOME = pandyaname__).

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 cdavec ~ ou $HOME dans un tel script bash?

5
Pandya

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

5
nux

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é.

3
Run CMD

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
2
choroba