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?

BrainStone
la source
$@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
slm
la source
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