Exécuter la commande fournie par les paramètres de fonction


15

J'essaie de créer une méthode de fonction dans un script bash qui exécute une commande qui est fournie à la méthode par les paramètres.

Ce qui signifie quelque chose comme ça:

special_execute()
{
    # Some code

    # Here's the point where the command gets executed
    $@

    # More code
}

special_execute echo "abc"

Je l' ai déjà j'essayé $@, "$@", $*, "$*"comment pourrais - je faire cela?


$@travaille pour moi .. special() { $@; }... special echo "foo"donnefoo
Drav Sloan

Cela n'a pas fonctionné pour moi avec: perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'ettar -cvf "backups/test.tar" -P "backups/uncompressed_server_backup_(DO NOT TOUCH!)/server/"
BrainStone

3
utilisez des guillemets "$@", alors vous aurez plus de succès :)
Drav Sloan

D'accord. Maintenant ça marche. il semble que j'ai foiré le code autour de l'appel.
BrainStone

pas de problème, nous avons tous ces moments :)
Drav Sloan

Réponses:


10

Je pense que c'est juste un problème de citation lorsque vous passez les arguments dans la fonction.

Essayez de l'appeler ainsi:

$ special_execute "echo 'abc'"
'abc'

Si vous ne voulez pas les guillemets simples, abcmodifiez-les comme ceci:

$ special_execute "echo abc"
abc

Débogage

Vous pouvez envelopper les internes de la fonction afin qu'elle résonne avec plus de verbosité.

$ function special_execute() { set -x; "$@"; set +x; }

Ensuite, lorsque vous exécutez des commandes via la fonction, special_executevous pouvez voir ce qui se passe.

exemple ps:

$ special_execute ps -eaf
+ ps -eaf
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug21 ?        00:00:01 /sbin/init
root         2     0  0 Aug21 ?        00:00:00 [kthreadd]
...

exemple perl:

$ special_execute perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
+ perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
1
2
3
4
5
6
7
8
9
10
+ set +x

Argument d'analyse $1

Vous pouvez faire quelque chose comme ça pour analyser tous les arguments passés en tant que $1.

$ function special_execute() { 
    [ "$1" -eq "-123" ] && echo "flagY" || echo "flagN"; 
    shift; 
    set -x; "$@"; set +x; 
  }

Exemple

avec le débogage activé:

$ special_execute -123 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
+ perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
1
2
3
4
5
+ set +x

avec débogage - -123:

$ special_execute -123 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
1
2
3
4
5

avec débogage - -456:

$ special_execute -456 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagN
1
2
3
4
5

Pourquoi est-ce que j'obtiens une erreur disant «commande introuvable» lors de l'utilisation d'alias?
Elie G.

@DrunkenPoney - pas une telle cmd, ça l'est alias.
slm
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.