Виконати команду, що надається параметрами функції


15

Я намагаюся створити метод функції в скрипті bash, який виконує команду, яку параметри подають до методу.

Означає щось таке:

special_execute()
{
    # Some code

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

    # More code
}

special_execute echo "abc"

Я вже пробував я $@, "$@", $*, "$*"як я міг це зробити?


$@працює для мене .. 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

Добре. Зараз це працює. здається, що я переплутав код навколо фактичного виклику.
BrainStone

немає проблем, у всіх нас є ті моменти :)
Drav Sloan

Відповіді:


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

Чому при використанні псевдонімів я отримую помилку із записом "команда не знайдена"?
Елі Г.

@DrunkenPoney - немає таких cmd, це так alias.
slm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.