web-dev-qa-db-fra.com

Comment déclarer des fonctions en tant que variables

Je veux déclarer une variable avec la fonction pwd (), ce qui me donnera le chemin actuel. Je veux utiliser la fonction pwd () comme variable $ {pwd}, quelque chose comme ça. Comment je dois écrire? Merci!

2
Ziyaddin Sadigov

Utilisez la substitution de commande:

$ myvar=$(pwd)
$ echo $myvar
/etc
$ echo $(pwd)
/etc
7
Nykakin

Fournir des fonctions en tant que paramètres n'est pas prévu et sera bientôt compliqué ou moche. Le seul moyen que je connaisse est via la fonction eval. L'approche de Nykakins ne passe pas une fonction, mais une valeur, comme vous pouvez le voir dans cet exemple comparatif:

#!/bin/bash
#
# Test providing a function as parameter
#
function f {
  param=$1
  echo "-----------------------"
  date +%T_%N
  sleep 0.3
  echo $param
  date +%T_%N
}

function e {
  param="$1"
  echo "-----------------------"
  date +%T_%N
  sleep 0.3
  eval $param
  date +%T_%N
}

f $(date +%T_%N) 
e "date +%T_%N"

Le premier style évalue la fonction 'date' avant de transmettre le résultat à la fonction client f, comme vous pouvez le constater, car la deuxième fois se situe avant la troisième:

-----------------------
14:00:12_983387321
14:00:12_980980238
14:00:13_287779378
-----------------------
14:00:13_290126185
14:00:13_594301594
14:00:13_596408013

Le deuxième bloc indique que la fonction transmise est évaluée entre les deux appels de date de la fonction électronique.

Vous n’avez peut-être pas à l’esprit cette convention de dénomination stricte lorsque vous demandez une fonction en tant que variable, mais je dirais que cela fait la différence entre une fonction en tant que variable et le résultat d’une fonction en tant que variable.

2
user unknown

Bash ne l’implémente pas, mais sinon, ce que vous demandez précisément, c’est-à-dire utiliser des variables exactement comme des fonctions, est très simple à implémenter avec les fonctions de discipline de ksh93, par exemple:

#!/bin/ksh93

function pwd.get
{
    .sh.value=$(pwd)
}

cd /var/tmp
echo $pwd
cd /tmp
echo $pwd

Lorsqu'il est exécuté, le script précédent indique:

/var/tmp
/tmp 
0
jlliagre