Comando de ejecución proporcionado por parámetros de función

15

Estoy tratando de crear un método de función en un script bash que ejecute un comando que los parámetros proporcionan al método.

Significa algo como esto:

special_execute()
{
    # Some code

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

    # More code
}

special_execute echo "abc"

Ya he probado yo $@, "$@", $*, "$*"¿cómo podría hacerlo?

BrainStone
fuente
$@funciona para mí ... special() { $@; }... special echo "foo"dafoo
Drav Sloan
No funcionó para mí con: perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'ytar -cvf "backups/test.tar" -P "backups/uncompressed_server_backup_(DO NOT TOUCH!)/server/"
BrainStone
3
use comillas "$@", entonces tendrá más éxito :)
Drav Sloan
Okay. Ahora funciona. Parece que estropeé el código alrededor de la llamada real.
BrainStone
no hay problema, todos tenemos esos momentos :)
Drav Sloan

Respuestas:

10

Creo que es solo un problema de citas cuando pasas los argumentos a la función.

Intenta llamarlo así:

$ special_execute "echo 'abc'"
'abc'

Si no desea las comillas simples abc, cambie las citas de esta manera:

$ special_execute "echo abc"
abc

Depuración

Puede ajustar los elementos internos de la función para que se repita con más verbosidad.

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

Luego, cuando ejecuta comandos a través de la función, special_executepuede ver lo que está sucediendo.

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

ejemplo 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

Argumento de análisis $1

Podrías hacer algo como esto para analizar cualquier argumento pasado como $1.

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

Ejemplo

con depuración habilitada:

$ 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 depuración desactivada -123:

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

con depuración desactivada -456:

$ special_execute -456 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagN
1
2
3
4
5
slm
fuente
¿Por qué aparece un error que dice 'comando no encontrado' cuando uso alias?
Elie G.
@DrunkenPoney: no existe tal cmd, lo es alias.
slm