Quelle est la meilleure pratique pour changer les répertoires de travail dans les scripts?
Pensez-vous modifier les répertoires à l'intérieur de bash ou Perl scripts est acceptable? Ou doit-on éviter de faire à tout prix?
Quelle est la meilleure pratique pour ce problème?
source d'informationauteur Tom Feiner
Vous devez vous connecter pour publier un commentaire.
Le répertoire de travail actuel est local à l'exécution de l'interpréteur, de sorte que vous ne pouvez pas affecter l'utilisateur sauf s'il est "pointiller" (de l'exécuter dans le shell courant, plutôt que de le faire fonctionner normalement la création d'un nouveau processus de shell) de votre script.
Une très bonne façon de le faire est d'utiliser des sous-coquille, qui, je le fais souvent dans alias.
La paranthesis assurez-vous que la commande est exécutée à partir d'un sous-shell, et n'affectera donc pas le répertoire de travail de ma coquille. Aussi il ne sera pas affecter le dernier répertoire de travail, de sorte cd -; fonctionne comme prévu.
Comme Hugo a dit, vous ne pouvez pas l'effet de votre processus parent du mdc donc il n'y a pas de problème.
Où la question est plus applicable si vous n'avez pas de contrôle l'ensemble du processus, comme dans un sous-programme ou un module. Dans ces cas, vous voulez sortir de la routine dans le même répertoire que vous avez entré, autrement subtile action à distance " se glisse dans la ce qui provoque des bugs.
Vous pouvez à présent par la main...
mais qui a des problèmes. Si la sous-routine retourne tôt ou décède, et l'exception est interceptée) votre code sera toujours dans
some/dir
. Aussi, lechdir
s peut échouer et vous devez vous rappeler de vérifier chaque utilisation. Bleh.Heureusement, il ya un couple de modules pour rendre cela plus facile. Fichier::pushd est un, mais je préfère Fichier::chdir.
Fichier::chdir facilite le changement de répertoires dans l'attribution de
$CWD
. Et vous pouvez localiser$CWD
de sorte qu'il sera remis à zéro à la fin de votre portée, n'importe quoi. Il a également vérifie automatiquement si lechdir
réussit et déclenche une exception dans le cas contraire. Parfois, il l'utiliser dans des scripts parce que c'est tellement pratique.Je ne fais pas ça souvent, mais parfois, il peut économiser beaucoup de maux de tête. Assurez-vous juste que si vous modifiez les répertoires, vous pouvez toujours changer le répertoire que vous avez commencé à partir. Sinon, changer les chemins de code pourrait quitter l'application, quelque part qu'il ne devrait pas être.
Pour Perl, vous avez la Fichier::pushd module CPAN, qui fait localement changer le répertoire de travail tout à fait élégante. Citant le synopsis:
Je vais deuxième Schwern et Hugo commentaires ci-dessus. Note Schwern l'attention sur le retour à l'annuaire d'origine en cas de survenance d'une sortie. Il a fourni les code Perl pour gérer cela. Je vais souligner le shell (Bash, Korn shell Bourne) commande de piège.
piège "cd $saved_dir" 0
sera de retour à saved_dir sur shell interne est exécuté à la sortie (si vous êtes . " ing le fichier).
mike
Considérons également que Unix et Windows intégré dans le répertoire de la pile: pushd et popd. Il est extrêmement facile à utiliser.
Est-ce possible d'essayer et d'utiliser pleinement quantifiés des chemins, et de ne pas faire d'hypothèses sur l'annuaire que vous vivez actuellement? par exemple,
plutôt que
Ce sera probablement plus facile dans le long terme, que vous n'avez pas à vous soucier de choses étranges qui se passe (votre script en train de mourir ou d'être tués avant de pouvoir mettre le répertoire de travail en cours au niveau où il était), et est peut-être plus portable.