SCRIPT BASH qui change de répertoire

Bonjour,

pardonnez la stupidité probable de ma question.

Je souhaite écrire un script qui crée une nouvelle arborescence (dans le répertoire courant ou dans un répertoire donné en option).

Je voudrais que lorsque le script a fini sa création, il rende la main en ayant modifié le répertoire courant, c’est à dire qu’en lançant le script depuis un répertoire, je me retrouve immédiatement dans la racine de ma nouvelle arborescence.

a priori, si je fait un «cd» dans le script, il n’est appliqué que pour son sous-shell.

Bien entendu, je peux envisager 2 méthodes: soit créer une fonction qui appelle le script puis applique cd, soit remplacer le script exécutable par un fichier à sourcer directement dans le shell d’appel (la console).

Mais je voudrais savoir si cette possibilité existe (il me semble que oui, mais n’écrivant plus beaucoup de scripts depuis longtemps, ma vieille et faible mémoire me laisse perplexe)

merci

PS une histoire avec $PPID, sans doute ?

L’exécution d’un script, comme tu l’indiques, se fait dans un sous-shell. Je ne pense pas qu’on puisse toucher au shell parent depuis le sous-shell sans grosse magouille. (Mais peut-être me planté-je.)

Ma façon de faire est donc d’exécuter mon script dans le shell parent, à l’aide de source (en bash), ou juste . (en sh). Et là, un simple cd suffit.

Merci Dunatotatos

c’est bien ce que je craignais. Un source impose de nommer le chemin du fichier, ce qui est moins pratique. Surtout il me semble qu’on ne peut lui passer ni option ni autre argument (ai-je raison ?).

Je pense donc passer par une fonction (dans ~/.bash_function) qui appelle le script avec ses arguments, puis réalise le cd /chemin

Crée un fichier gocd (touch gocd par exemple), ensuite édite le avec vi par exemple et met ça dedans :

#!/bin/ksh
function go_cd
{
  if [ $# = 1 ]
  then
    cd $1
  else
        return 1
  fi && pwd
}

Tu l’exécutes comme ça :

$ . gocd

A partir de maintenant d’où tu sois tu peux faire :

$ go_cd le_nom_du_répertoire_ou_tu_veux_aller 

Juste pour montrer qu’un script peut te déplacer :slightly_smiling:

source laisse les même libertés d’utilisation que l’exécution d’un script dans un sous-shell. Tu peux passer arguments et options (comme l’a montré debianhadic), et la commande va chercher dans le $PATH.

Merci DEBIANHADIC

si j’ai bien compris, on peut écrire un script normalement, avec ses avantages (passer des arguments avec la commande), et le sourcer ( . ) au lieu de l’exécuter.

Mais je suppose qu’il faudra toujours lui donner son chemin complet. Dans ce cas un alias sur ce script fera plus simplement l’affaire.

Je m’y remets dés que possible. Encore merci à tous les deux.

EDIT
en effet tout cela devrait marcher: voici l’extrait du man bash:

source fichier [arguments] Lire et exécuter les commandes du fichier dans l'environnement de l'interpréteur actuel, puis renvoyer l'état final de la dernière commande exécutée dans fichier. Si le nom du fichier ne contient pas de barre oblique, les chemins d'accès contenus dans PATH sont parcourus pour rechercher le répertoire contenant le fichier. Lorsqu'il est recherché dans PATH le fichier n'a pas besoin d'être exécutable. Lorsque bash n'est pas en mode posix, le répertoire de tra vail actuel est finalement examiné si aucun fichier n'est trouvé dans PATH. Si l'option sourcepath de la commande interne shopt est désactivée, le PATH n'est pas parcouru. Si des arguments sont fournis, ils sont transmis dans les paramètres positionnels lorsque le fichier est exécuté. Sinon les paramètres positionnels ne sont pas modifiés. L'état renvoyé est l'état de la dernière commande terminée au sein du script (0 si aucune commande n'a été exécutée) et faux si le fichier n'est pas trouvé ou ne peut être lu.

Les arguments doivent être donnés après le nom du script.

Évidemment, toutes les commandes exit doivent être supprimées (contrôles d’erreur).