2009-09-07 7 views
0

Mon fonctionnement interne .bashrc ressemble à quelque chose comme ça ...Masquer une fonction bash

export PERL5LIB="/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0/${PLAT}-thread-multi" 
export PERL5LIB="${PERL5LIB}:/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0" 

function dev { 
    export PERL5LIB="/dev/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0/${PLAT}-thread-multi" 
    export PERL5LIB="${PERL5LIB}:/dev/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0" 
} 

Le problème est que lorsque je grep pour PERL5LIB est tout voir.

> env | grep PERL 
PERL5LIB=/tools/perl/Linux/x86_64/lib/perl5/5.10.0/x86_64-thread-multi:/tools/perl/Linux/x86_64/lib/perl5/5.10.0 
export PERL5LIB="/dev/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0/${PLAT}-thread-multi"; 
export PERL5LIB="${PERL5LIB}:/dev/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0"; 

Donc, c'est ramasser les choses à l'intérieur de ma fonction "dev". Y a-t-il un moyen de cacher le contenu d'une fonction? Ou dois-je juste me habituer à getenv .. Les vieilles habitudes sont difficiles à casser ..

+0

Etes-vous sûr que vous utilisez "env" et non "set"? env ne montre que l'environnement, pas les fonctions bash. – camh

+0

Positif. Je tape tout le temps! env | grep XYZ. Le problème est mon .bash_profile a grandi et il est difficile d'analyser. – rh0dium

+0

Je suis content que vous ayez compris ce qui se passait - cela vous dérangerait-il d'expliquer quel était le problème quelque part? –

Répondre

1

Exécutez type env à l'invite bash, et fournissez la sortie; pour moi, cela indique que env est /usr/bin/env, un exécutable séparé; De tels exécutables n'ont aucun moyen de savoir quoi que ce soit à propos des fonctions ou des variables non exportées.

Cela dit, sans résoudre le problème sous-jacent (l'utilisation étant la cause probable d'un bash intégré, fonction ou pseudonyme à la place de /usr/bin/env, que la sortie de la commande de type montrera), il y a une solution de contournement disponible: env | grep '^PERL' ; le caret n'émettra que des lignes commençant par PERL (par opposition à PERL n'importe où dans la ligne), et le contenu de la fonction est indenté en sortie de set (qui semble être en cours d'exécution à la place de env; encore une fois, type env devrait donner une idée de la cause).

Un point de clarification: set est un bash intégré qui, lorsqu'il est exécuté sans arguments, vide les variables définies (environnement ou autre) et les fonctions; lorsqu'il exécute avec des arguments, il a d'autres comportements complètement différents (et spécifiés par POSIX). env, en tant que programme externe, n'a pas accès aux variables non exportées ou aux fonctions définies dans le shell qui l'appelle.

specified by POSIX pour vider toutes les variables shell, sa fonctionnalité supplémentaire de définitions de fonctions de dumping est à ma connaissance une extension au-delà de la lettre de la norme).

+0

env est/usr/local/bin/env – rh0dium

+0

Pouvez-vous expliquer votre deuxième commentaire WRT "output of set"? Merci – rh0dium

+1

... et c'est la sortie de 'type', pas' which'? Si ce que vous appelez est vraiment '/ usr/local/bin/env', il n'a aucun moyen de savoir quelles sont les fonctions de votre shell, et donc de les jeter. –

1

Essayez:

(set -o posix ; set) 
+1

Je suppose que vous pourriez avoir du plaisir avec les fonctions et les alias pour que 'env' invoque toujours cette séquence lorsqu'il est appelé sans arguments - mais si je comprends bien, le but ici est de trouver un moyen pour rh0dium d'obtenir le comportement désiré * sans changer ses habitudes * (et donc la ligne de commande qu'il conduit habituellement). –