如何用包装器重新获得对命令的控制?

时间:2011-09-08 17:45:31

标签: perl wrapper

我的公司习惯在他们的启动程序命令周围放置包装器,例如:

'MGC_HOME / bin中/ dmgr_ic'

将启动MGC环境,允许人们只需键入'dmgr_ic',它将检查一些环境变量并为您加载程序。这些包装器很有用,但我想在原始命令中添加一些选项,例如

MGC_HOME / bin / dmgr_ic -geometry 800x600 + 0 + 0

调整放置不当窗口的大小。有任何想法吗?我无法以任何方式触摸原始包装,也不想制作我自己的副本或版本。简单地使用包装器并以某种方式捕获有问题的命令并修改它会很好。

感谢。

3 个答案:

答案 0 :(得分:1)

涉及修改包装器脚本的选项 - 这些想法足以让他们购买更改它们:

  • 通过新的-xargs xyz包装器参数添加提供给包装器的参数(最佳)

  • 通过特殊环境变量

  • 添加提供给包装器的参数
  • 通过~/.dmgr_ic_rc文件

  • 添加提供给包装器的参数

涉及NOT修改包装器脚本的选项:

  • 创建一个Perl脚本(称为dmgr_ic),将当前包装器复制到/tmp,修改它以添加-xargs选项,并调用该临时副本。不是一个好主意,但有效。

  •   -

答案 1 :(得分:1)

这些包装脚本是非常复杂的,还是只有一个内容?

可以运行set -xv,然后使用bash -n运行包装器脚本。这不会执行命令,但会打印出假设要执行的内容,我假设它可能是最后一行。

然后,你可以接受实际执行的命令,并将自己的东西附加到它上面。这将涉及包装包装脚本。

他们需要更改包装脚本并使其更灵活。我不介意默认值,但允许它们被命令行参数覆盖。例如,默认值可能是:

somescript -f foo -b bar -u uff

但是,如果我这样做了

somescript -f fufu

脚本将执行:

somescript -f fufu -b bar -u uff

这可以通过创建Perl包装并使用Getopt::Long轻松完成。快速而肮脏的实现可能如下所示:

use GetOpt::Long;

# Default Values for Paremters
my $foo = bar
my $bar = foo
my $fubar;           #No default, but valid parameter

GetOptions (
    "foo:s" => \$foo,
    "bar:s  => \$bar,
    "fubar:s" => \$fubar,
) or die qq($USAGE\n);

if (defined $fubar) {
    $fubar = "-fubar $fubar";
}
system qq(mycommand -foo $foo -bar $bar $fubar);

不是100%的有效代码,但你应该明白这一点。

您的想法是需要注意-fubar等可选参数。在上文中,如果存在参数$fubar,我将$fubar与参数和值组合在一起。另一种选择是使用哈希来存储参数(可能使用GetOptions),然后通过哈希构建命令行参数。

无论如何,让包装器更灵活并提供所需的默认值以及覆盖这些默认值的能力并不难。

答案 2 :(得分:0)

尝试

mv MGC_HOME/bin/dmgr_ic MGC_HOME/bin/dmgr_ic.orig

然后创建MGC_HOME / bin / dmgr_ic作为包含

的文本文件
#!/bin/sh
MGC_HOME/bin/dmgr_ic.orig -geometry 800x600+0+0

然后

chmod 755 MGC_HOME/bin/dmgr_ic