2017-06-15 4 views
2

J'ai un alias:conditionnellement abandon dans un alias Bash

alias local='if [ -z "${FUNCNAME[0]}" ]; then builtin local; fi; declare' 

Ce que je veux utiliser pour rediriger les commandes locales dans ma fonction annoncez modifié, qui peut alors déclarer les variables, et seulement utiliser le builtin local pour obtenir messages d'erreur si en dehors d'une fonction.

L'alias a une sortie de (en utilisant -x set):

+ '[' -z '' ']' 
+ builtin local 
-bash: local: can only be used in a function 
+ declare 

En ce moment, il exécute la declare de toute façon et je voudrais pour sortir si la vérification échoue. Je ne peux pas utiliser une fonction pour cela.

Jusqu'à présent, je l'ai essayé retour, pause et la sortie (sortie pas ici pour des raisons évidentes):

alias 'local=if [ -z "${FUNCNAME[0]}" ]; then builtin local; return 1; break; fi; declare' 

+ '[' -z '' ']' 
+ builtin local 
-bash: local: can only be used in a function 
+ return 1 
-bash: return: can only `return' from a function or sourced script 
+ break 
-bash: break: only meaningful in a `for', `while', or `until' loop 
+ declare 

Exemple:

# When outside an function 
local some_var=val 
+ '[' -z '' ']' 
+ builtin local 
-bash: local: can only be used in a function 
# That's it 

# When inside an function func 
local some_var=val 
+ '[' -z func ']' 
+ declare some_var=val 
# Uses my modified declare function 
+0

Essayez-vous d'ombrer le mot clé 'local'? Quoi qu'il en soit, pourquoi ne pas mettre 'declare' dans un bloc' else' si vous ne voulez pas qu'il s'exécute à chaque fois? –

+2

n'est pas 'local: ne peut être utilisé que dans une fonction', l'expliquer? Ne fais pas ça! ;-) Tout ce qui va prendre des arguments variables devrait être écrit comme une fonction. Bonne chance. – shellter

+0

@Eric Renouf Si je mets la déclaration dans un autre bloc, il ne pourra pas déclarer les variables, voir ma mise à jour. – BonBon

Répondre

1

Comme builtin local est uniquement utilisé pour le message d'erreur, cela fonctionnera:

alias local='builtin local 2>&1 >/dev/null; [ -n "${FUNCNAME[0]}" ] && declare' 

Il sera toujours seulement imprimer l'erreur, sinon dans une fonction, mais a gagné « t imprimer toutes les variables locales si l'intérieur d'un:

$> func() { local var2=foo; local var=bar; echo $var; } 
$> func 
+ func 
+ builtin local 
+ '[' -n func ']' 
+ declare var2=foo 
+ builtin local 
+ '[' -n func ']' 
+ declare var=bar 
+ echo bar 
bar 

de cette façon locale se remplacé par formuleront qui je peux modifier avec une enveloppe.

1

Je ne sais pas pourquoi vous avez besoin d'un tel alias. Dans tous les cas, n'utilisez pas d'alias pour cela. Utilisez une fonction à la place:

local() { 
    if [ -z "${FUNCNAME[0]}" ]; then 
    builtin local "[email protected]" 
    else 
    declare -g "[email protected]" # -g (for global) is necessary - otherwise variable set by declare would be local to the function 
    fi 
} 
+0

Je suis assez sûr qu'une fonction à l'intérieur d'une fonction ne peut pas faire de variables globales, pouvez-vous confirmer cela? – BonBon

+0

-g fonctionne à l'intérieur d'une fonction – codeforester

+0

Comme c'est le cas maintenant, cela retournera toujours vrai car il est dans une fonction nommée 'locale' – BonBon