Eseguire il comando fornito dai parametri della funzione


15

Sto cercando di creare un metodo di funzione in uno script bash che esegue un comando che viene fornito al metodo dai parametri.

Significa qualcosa del genere:

special_execute()
{
    # Some code

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

    # More code
}

special_execute echo "abc"

Ho già provato io $@, "$@", $*, "$*"come potrei farlo?


$@funziona per me .. special() { $@; }... special echo "foo"foo
Drav Sloan il

Non ha funzionato per me con: perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'etar -cvf "backups/test.tar" -P "backups/uncompressed_server_backup_(DO NOT TOUCH!)/server/"
BrainStone,

3
usa le virgolette "$@", quindi avrai più successo :)
Drav Sloan,

Ok. Ora funziona. sembra che abbia incasinato il codice attorno alla chiamata effettiva.
BrainStone,

nessun problema, abbiamo tutti quei momenti :)
Drav Sloan,

Risposte:


10

Penso che sia solo un problema di citazione quando passi gli argomenti nella funzione.

Prova a chiamarlo così:

$ special_execute "echo 'abc'"
'abc'

Se non vuoi le virgolette singole in giro abc modifica la citazione in questo modo:

$ special_execute "echo abc"
abc

Debug

Puoi racchiudere gli interni della funzione in modo che risuoni con maggiore verbosità.

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

Quindi quando esegui i comandi tramite la funzione, special_execute puoi vedere cosa sta succedendo.

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

esempio 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

Argomento di analisi $1

Si potrebbe fare qualcosa del genere per analizzare qualsiasi argomento passato come $1.

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

Esempio

con debug abilitato:

$ 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

con il debug disattivato - -123:

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

con il debug disattivato - -456:

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

Perché viene visualizzato un errore che dice "comando non trovato" quando si utilizzano gli alias?
Elie G.

@DrunkenPoney - nessun cmd, lo è alias.
slm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.