Executar comando fornecido pelos parâmetros de função


15

Estou tentando criar um método de função em um script bash que executa um comando que é fornecido ao método pelos parâmetros.

Significado algo como isto:

special_execute()
{
    # Some code

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

    # More code
}

special_execute echo "abc"

Eu já tentei I $@, "$@", $*, "$*"como eu poderia fazer isso?


$@funciona para mim .. special() { $@; }... special echo "foo"foo
Drav Sloan 28/08

Não funcionou para mim com: 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 28/08

3
usar aspas ao redor "$@", então você terá mais sucesso :)
Drav Sloan

Está bem. Agora funciona. parece que eu estraguei o código em torno da chamada real.
28313 BrainStone

nenhum problema, todos nós temos aqueles momentos :)
Drav Sloan

Respostas:


10

Eu acho que é apenas uma questão de citar quando você está passando os argumentos para a função.

Tente chamar assim:

$ special_execute "echo 'abc'"
'abc'

Se você não quiser aspas simples abc, altere as aspas da seguinte maneira:

$ special_execute "echo abc"
abc

Depuração

Você pode agrupar as partes internas da função para que ela ecoe com mais verbosidade.

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

Então, quando você executa comandos através da função, special_executepode ver o que está acontecendo.

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

exemplo 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álise $1

Você poderia fazer algo assim para analisar quaisquer argumentos passados ​​como $1.

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

Exemplo

com a depuração ativada:

$ 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

com a depuração - -123:

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

com a depuração - -456:

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

Por que recebo um erro dizendo 'comando não encontrado' ao usar aliases?
Elie G.

@DrunkenPoney - não existe esse cmd, é alias.
Slm
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.