2009-08-25 3 views
1

Je viens de trouver this script Shell très utile ici sur SO, mais malheureusement, il ne fonctionne pas sur Mac OS X 10.5.Shell script qui monte N dossiers dans le système de fichiers

Ceci est le script en question (copié pour la commodité):

#!/bin/bash 
LIMIT=$1 
P=$PWD 
for ((i=1; i <= LIMIT; i++)) 
do 
    P=$P/.. 
done 
cd $P 

J'ai essayé de echo $P à la fin et il est de retour dans le droit chemin, mais cd $P ne semble pas fonctionner.

J'ai donc essayé d'entrer manuellement P="some/path" et cd $P dans le terminal et cela a fonctionné. Je ne comprends pas pourquoi la même commande ne fonctionne pas dans le script. Serait-ce une chose de sécurité?

Des suggestions?

Répondre

5

J'ai eu le même problème sur Linux, en fait, si je comprends bien ce que j'ai trouvé après quelques recherches, voici ce qui se passe:

La commande est lancée dans un sous-shell, et dans ce sous-shell le chemin est modifié, vous ne voyez pas la modification car lorsque le script se termine, vous revenez au shell de départ (parent).

Je résolu ce problème en mettant ce script utile dans mon .bashrc en fonction, comme ceci:

up(){ 
    #code goes here 
} 

Une autre option est à la source du script chaque fois que vous lancez, mais je préfère la première .

+0

Cela semble prometteur, mais savez-vous ce que l'équivalent mac du .bashrc est (un .bashrc n'existe pas dans mon répertoire personnel)? Je ne sais même pas ce que le shell standard Mac est :-( –

+1

si vous n'avez pas de .bashrc vous pouvez toujours le créer ou éditer .bash_profile instaed – ennuikiller

+0

Avez-vous un ~/.bash_profile ou un ~/.profile? Oui, vous pouvez les utiliser.Que se passe-t-il si vous écrivez simplement bash et appuyez sur Entrée à l'invite de commande? –

2

Une fois le script shell terminé, il vous remettra directement dans le répertoire à partir duquel il a été exécuté. Le CD seul effet CWD du processus de script

2

Vous modifiez uniquement le répertoire de travail pour la copie du shell qui exécute le script en tant qu'interprète, pas le programme shell d'origine à partir duquel vous avez lancé le script. Pour un shell de type bash, afin de lancer une séquence de commandes qui fonctionnent sur la session shell interactive, vous pouvez les définir comme une fonction shell.

par exemple. tapez la commande suivante

up() { LIMIT=$1; P=$PWD; for ((i=1; i <= LIMIT; i++)); do P=$P/..; done; cd $P; } 

et vous définissez une commande jusqu'à qui fonctionne de la façon dont vous l'intention.

Vous pouvez placer cette définition de fonction dans un fichier provenant de la connexion, tel que .bashrc, afin de le conserver de manière pratique lors de la connexion.

1

Si vous voulez exécuter le script dans le contexte de votre shell actuel faire juste une des options suivantes (en supposant que votre script shell est appelé cdup)

. cdup 3 
source cdup 3 

La commande source (et son alias.) Run le script fourni dans le contexte de votre shell actuel, à savoirils ne démarrent pas un sous-shell séparé pour exécuter la commande de sorte que votre cd fonctionne comme dans le shell actuel

+0

Je ne connaissais pas la commande source. Merci! –

1

Petit ajout à la fonction up(); ajoutez le test sans valeur:

LIMIT = $ 1
if [-z "$ LIMIT"]; puis
LIMITE = 1
fi

et plus "cd .." - juste "up"

+0

Merci, c'est très utile. –

Questions connexes