Führen Sie den Befehl aus, der von den Funktionsparametern bereitgestellt wird

15

Ich versuche, eine Funktionsmethode in einem Bash-Skript zu erstellen, die einen Befehl ausführt, der von den Parametern an die Methode übergeben wird.

Bedeutet so etwas:

special_execute()
{
    # Some code

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

    # More code
}

special_execute echo "abc"

Ich habe bereits versucht , ich $@, "$@", $*, "$*"wie könnte ich das tun?

BrainStone
quelle
$@arbeitet für mich ... special() { $@; }... special echo "foo"gibtfoo
Drav Sloan
Es hat bei mir nicht funktioniert mit: perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'undtar -cvf "backups/test.tar" -P "backups/uncompressed_server_backup_(DO NOT TOUCH!)/server/"
BrainStone
3
Verwenden Sie Anführungszeichen "$@", dann werden Sie mehr Erfolg haben :)
Drav Sloan
In Ordnung. Jetzt funktioniert es. Es scheint, als hätte ich den Code um den eigentlichen Anruf herum durcheinander gebracht.
BrainStone
Kein Problem, wir haben alle diese Momente :)
Drav Sloan

Antworten:

10

Ich denke, es ist nur ein Anführungszeichen, wenn Sie die Argumente in die Funktion übergeben.

Versuchen Sie es so zu nennen:

$ special_execute "echo 'abc'"
'abc'

Wenn Sie die einfachen Anführungszeichen nicht verwenden möchten, abcändern Sie das Anführungszeichen wie folgt:

$ special_execute "echo abc"
abc

Debuggen

Sie können die Interna der Funktion so umschließen, dass sie ausführlicher wiedergegeben wird.

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

Wenn Sie dann Befehle über die Funktion ausführen, können special_executeSie sehen, was los ist.

ps Beispiel:

$ 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]
...

Perl Beispiel:

$ 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

Parsing-Argument $1

Sie können so etwas tun, um Argumente zu analysieren, die als übergeben wurden $1.

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

Beispiel

mit aktiviertem Debugging:

$ 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

beim Debuggen aus - -123:

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

beim Debuggen aus - -456:

$ special_execute -456 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagN
1
2
3
4
5
slm
quelle
Warum erhalte ich bei Verwendung von Aliasnamen die Fehlermeldung "Befehl nicht gefunden"?
Elie G.
@ DrunkenPoney - keine solche cmd, es ist alias.
SLM