Выполнить команду, заданную параметрами функции

15

Я пытаюсь создать метод функции в скрипте bash, который выполняет команду, которая передается методу в параметрах.

Имея в виду что-то вроде этого:

special_execute()
{
    # Some code

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

    # More code
}

special_execute echo "abc"

Я уже пробовал я $@, "$@", $*, "$*"как я мог это сделать?

BrainStone
источник
$@работает для меня .. special() { $@; }... special echo "foo"даетfoo
Драв Слоан
Это не работает для меня с: perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'иtar -cvf "backups/test.tar" -P "backups/uncompressed_server_backup_(DO NOT TOUCH!)/server/"
BrainStone
3
используйте цитаты вокруг "$@", тогда у вас будет больше успеха :)
Drav Sloan
Ok. Теперь это работает. кажется, что я испортил код вокруг фактического вызова.
BrainStone
нет проблем, у всех нас есть такие моменты :)
Драв Слоан

Ответы:

10

Я думаю, что это просто проблема цитирования, когда вы передаете аргументы в функцию.

Попробуйте назвать это так:

$ special_execute "echo 'abc'"
'abc'

Если вы не хотите использовать одинарные кавычки, abcизмените кавычки следующим образом:

$ special_execute "echo abc"
abc

Отладка

Вы можете обернуть внутреннюю часть функции так, чтобы она отражалась в большей детализации.

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

Затем, когда вы запускаете команды через функцию, special_execute вы можете видеть, что происходит.

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

пример 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

Разбор аргумента $1

Вы можете сделать что-то вроде этого, чтобы проанализировать любые аргументы, переданные как $1.

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

пример

с включенной отладкой:

$ 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

с отладкой - -123:

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

с отладкой - -456:

$ special_execute -456 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagN
1
2
3
4
5
SLM
источник
Почему я получаю сообщение об ошибке «команда не найдена» при использовании псевдонимов?
Эли Г.
@DrunkenPoney - нет такого cmd, это так alias.
SLM