执行功能参数提供的命令


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
Drav Sloan

它对我不起作用: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

Answers:


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

您可以执行类似的操作来解析以as形式传入的所有参数$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

为什么在使用别名时出现“找不到命令”的错误提示?
Elie G.19年

@DrunkenPoney-没有这样的cmd,是alias
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.