Wykonaj polecenie dostarczone przez parametry funkcji

15

Próbuję utworzyć metodę funkcji w skrypcie bash, który wykonuje polecenie dostarczone do metody przez parametry.

Czyli coś takiego:

special_execute()
{
    # Some code

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

    # More code
}

special_execute echo "abc"

Próbowałem już I $@, "$@", $*, "$*"w jaki sposób mogę to zrobić?

BrainStone
źródło
$@działa dla mnie .. special() { $@; }... special echo "foo"dajefoo
Drav Sloan
Nie działało to dla mnie z: perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'itar -cvf "backups/test.tar" -P "backups/uncompressed_server_backup_(DO NOT TOUCH!)/server/"
BrainStone
3
użyj cudzysłowów "$@", a wtedy odniesiesz większy sukces :)
Drav Sloan
Dobrze. Teraz działa. wygląda na to, że zepsułem kod wokół rzeczywistego wywołania.
BrainStone
nie ma problemu, wszyscy mamy takie chwile :)
Drav Sloan

Odpowiedzi:

10

Myślę, że to tylko kwestia cytowania, gdy przekazujesz argumenty do funkcji.

Spróbuj nazwać to tak:

$ special_execute "echo 'abc'"
'abc'

Jeśli nie chcesz mieć pojedynczych cytatów, abczmień cytat w następujący sposób:

$ special_execute "echo abc"
abc

Debugowanie

Możesz owinąć elementy wewnętrzne funkcji, aby odbijały się echem z większą szczegółowością.

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

Następnie, gdy uruchamiasz polecenia przez funkcję, special_executemożesz zobaczyć, co się dzieje.

przykład 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]
...

przykład perla:

$ 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

Parsowanie argumentu $1

Możesz zrobić coś takiego, aby przeanalizować argumenty przekazane jako $1.

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

Przykład

z włączonym debugowaniem:

$ 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

z wyłączonym debugowaniem - -123:

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

z wyłączonym debugowaniem - -456:

$ special_execute -456 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagN
1
2
3
4
5
slm
źródło
Dlaczego pojawia się błąd z informacją, że „nie znaleziono polecenia” podczas używania aliasów?
Elie G.
@DrunkenPoney - nie ma takiego cmd, to jest alias.
slm