web-dev-qa-db-fra.com

Dans un script bash, comment puis-je accéder à un répertoire dont le nom est stocké dans une variable?

Je fais un script FileCreator:

#!/bin/bash

echo "Welcome to the file creator! Please type the directory name:"
read dirName

mkdir $dirName

#Now I want to change directory to that new $dirName that will be run from Terminal.

Ma question est maintenant, comment changer le chemin d'accès à ce nouveau répertoire dirName qui est visible sur le terminal. Donc, à la fin, le chemin devrait être: /home/my_user_name/SCRIPTS/dirName quand je lance ce script ...

S'il vous plaît, juste une suggestion? :)

3
andrej benedičič

La commande cd change le répertoire dans lequel vous vous trouvez . Exécutez help cd pour plus de détails.

Si dirName est un shell variable qui contient le nom du répertoire auquel vous souhaitez accéder, alors

cd -- "$dirName"

ira là-bas. Par exemple, si vous démarrez dans /home/my_user_name/SCRIPTS et que la variable dirName contient le texte foo, cette commande vous conduit à /home/my_user_name/SCRIPTS/foo.

Si vous voulez toujours que dirName soit interprété comme un chemin relatif dans /home/my_user_name/SCRIPTS, quel que soit le lieu où l'utilisateur exécute votre script, utilisez:

cd -- "/home/my_user_name/SCRIPTS/$dirName"

Vous avez peut-être remarqué l'argument principal -- et l'utilisation de la citation :

  • Dans un script, lorsque vous passez l'entrée utilisateur sous la forme arguments à une commande qui accepte options commençant par - ou --, c'est généralement une bonne idée de passer l'option --) d'abord. La plupart des commandes acceptant les arguments de nom de fichier prennent en charge cette syntaxe (vous devez toutefois toujours vérifier). Cela signifie que tous les arguments ultérieurs doivent être interprétés comme des noms de fichiers plutôt que comme des options.

    Pour comprendre cela, essayez de lancer ls -l et essayez de lancer ls -- -l. Vous n'avez généralement pas besoin d'utiliser l'argument -- lorsque vous tapez des commandes manuellement. Toutefois, dans un script qui transmet la valeur d'une entrée non authentifiée à une commande, il est fréquemment utilisé.

  • Dans les deux commandes, j'ai utilisé guillemets (""). C'est généralement ce que vous voulez lorsque vous développez une variable qui contient un nom de fichier.

    Comme si vous n’utilisiez pas de guillemets, mais contrairement à guillemets simples (''), les guillemets doubles permettent développement des paramètres . Ainsi, ils n'empêchent pas $dirName d'être étendu à la valeur qui lui a été attribuée par la commande read. Cependant, contrairement à l’absence de guillemets, mais comme les guillemets simples, les guillemets doubles empêchent fractionnement de mots . De cette façon, si la variable contient des espaces (ou caractères présents dans IFS , si cela a été défini ), elle fonctionnera toujours correctement.

    Voir aussi .1.2 Citations dans le Manuel de référence de Bash .

Je recommande également d'utiliser des guillemets doubles dans votre commande mkdir, et probablement aussi --:

mkdir -- "$dirName"

Notez cependant que changer le répertoire en cours dans un script Shell ne provoque pas le processus de le processus appelant = modifié. Cela est voulu par la conception (et concerne la plupart des systèmes d’exploitation, voire tous, y compris Windows). Lorsqu'un programme exécute un autre programme, il ne s'attend pas à ce que son propre répertoire actuel soit modifié.

Chaque programme a son propre environnement et son propre répertoire courant. Lorsque vous démarrez un nouveau programme, il hérite de celui qui l'a démarré, mais il possède sa propre copie. Lorsqu'un processus enfant modifie son répertoire actuel, il ne sera pas reflété dans le processus parent .

Souvent, lorsque vous souhaitez changer de répertoire pour l'appelant, la bonne approche consiste à reconsidérer votre conception. Avez-vous vraiment besoin de ça?

En gros, la seule situation dans laquelle il est raisonnable de changer de répertoire pour l'appelant est lorsque votre script est en réalité une simple liste de commandes qui pourraient tout aussi bien être exécutées directement par l'appelant. Quand c'est le cas, vous pouvez générer le script au lieu de l'exécuter . Par exemple, supposons que vous exécutiez actuellement votre script avec la commande suivante:

./my_script

Ensuite, vous pouvez à la place le source avec:

. ./my_script

Cette syntaxe alternative est également supportée:

source ./my_script

The Bash Shell supporte à la fois les . et sourcecommandes intégrées , et elles sont équivalentes. (Exécutez help . ou help source pour plus de détails.)

Cela provoque toutes les commandes de votre script à exécuter dans le shell actuel , plutôt que dans un nouveau shell (ce qui se produit lorsque vous exécutez en réalité un script shell).

8
Eliah Kagan