Je veux écrire du code pour me permettre de passer à certains répertoires auxquels je vais habituellement. Disons que ce programme est mycd
et /a/very/long/path/name
est le répertoire dans lequel je veux aller.
Je peux donc simplement taper mycd 2
au lieu de cd /a/very/long/path/name
. Ici, je suppose que mycd
sait 2
fait référence à cela /a/very/long/path/name
. Il pourrait aussi être mycd 1
, mycd 3
... etc.
Le problème est que je dois écrire en mycd
tant que script shell et taper . mycd 2
pour faire la chose désirée car sinon le script est simplement exécuté dans un script enfant qui ne change rien au shell parent dont je me soucie réellement.
Ma question est:
puis-je le faire sans utiliser
source
? car. mycd
suppose qu'ilmycd
doit s'agir d'un script shell et cela pourrait également introduire certaines fonctions dont je ne veux pas.puis-je l'implémenter dans d'autres langages de programmation?
la source
mycd
passer$@
n'importe quel programme que j'aime."$@"
afin que tous les arguments contenant des espaces soient traités correctement.Vous ne pouvez pas changer le répertoire courant d'un shell à partir d'un autre processus. Seul le processus lui-même peut changer son propre répertoire courant. Cela vaut également pour d'autres caractéristiques telles que les variables d'environnement et les descripteurs de fichiers.
Il est en fait possible d'affecter le répertoire actuel d'un autre processus en le faisant exécuter un
chdir
appel système via l'ptrace
appel système, ce qui permet aux débogueurs de fonctionner. Cependant, si le processus conserve certaines structures de données internes qui doivent être cohérentes avec le répertoire actuel, le programme risque de se bloquer. Pour un shell, cette approche n'a aucune chance de fonctionner.Vous devez organiser l'exécution de votre code par le shell lui-même. La manière normale de procéder serait d'en faire une fonction shell et de la stocker dans votre
~/.bashrc
. Si ce n'est pas possible, par exemple parce que c'est du code que vous souhaitez distribuer, écrivez un fichier source de shell qui contient la définition de la fonction et dites aux gens de faire lire leur fichier par leur shell interactif avec la.
commande .la source
ws=$1; gdb -p $(ps h -o ppid -p $$) -ex "call chdir(\"$wd\")" -ex "call set_working_directory(\"$wd\")" -ex detach -ex q -batch
. Exécuter en tant quebraindead-cd-parent /
. Vous verrez que lespwd
retours/
et ainsils
, etc. se comportent. Mais l'invite (PS1
) est toujours inchangée, les yeux des gens sont blessés, etc. Ne faites donc pas cela même si c'est possible.ptrace
méthode que je mentionne. Cela fonctionne bien sur les programmes qui ne se soucient pas beaucoup de leur répertoire actuel. Dans un shell, beaucoup de choses (PWD
variables, invite, etc.) vont se tromper, et le shell peut se bloquer ou mal se comporter autrement.Comme vous l'avez souligné vous-même, les scripts shell sont toujours exécutés dans un sous-shell, ce qui ne peut pas influencer son shell parent.
Vous pouvez cependant ...
alias mycd2='cd /a/very/long/path/name'
que votre script 1 génère une commande shell valide ...
... et exécutez sa sortie:
$(mycd 2)
1: Vous souhaiterez probablement utiliser une
case
instruction plutôt que laif
condition dans l'exemple.la source