【问题标题】:Maintain external shell environment from within a Perl script在 Perl 脚本中维护外部 shell 环境
【发布时间】:2011-10-04 12:39:18
【问题描述】:

我有一个 Perl 脚本,它需要调用 IBM db2 来处理一些命令。问题是每次调用都会破坏 db2 连接

这不起作用:

$> db2 connect to foo
$> perl -e 'print `db2 list tables for schema bar|some_filter`;'

也不是这样:

$> perl -e 'print `db2 connect to foo`; print `db2 list tables for schema bar|some_filter`;'

也不是这样:

$> perl -e 'print `db2 connect to foo && db2 list tables for schema bar|some_filter`;'

在每种情况下,在执行第二个命令时连接都会丢失。

这行得通:

#!/usr/bin/perl
print `db2 connect to foo`;
print `db2 list tables for schema bar`;

但这不是:

#!/usr/bin/perl
print `db2 connect to foo`;
print `db2 "select count * from bar"`;

一种解决方法是从 Perl 生成一个 bash 脚本并执行它,但直接执行它会更好。有什么办法吗?

【问题讨论】:

  • 在您的最后一个示例中,这两个命令在同一个子shell 中运行,并且必须具有相同的环境。 db2 是别名而不是可执行程序的名称吗?
  • 你的第二个例子对我有用。我在Linux和AIX下试过了。但是,我已经加载了安装在我的系统上的 db2profile shell 脚本。你做到了吗?
  • 我把管道遗漏到了some_filter,这打破了它。已编辑。
  • 为什么不使用DBI 和 DBD::DB2 模块?

标签: perl bash db2 environment-variables


【解决方案1】:

db2 的每个单独调用都必须重新连接,然后才能对数据库执行任何操作,并且当调用结束时,连接将终止。因此,您观察到的行为是意料之中的。

如果您使用 Perl,请认真考虑使用 DBI

如果这不是一个选项,那么您需要考虑将 Perl 脚本中的 db2 程序作为一个子进程运行,其中有一个通向它的管道,您可以在该管道上编写命令和一个从它返回的管道。您需要将命令写入db2,然后能够解析返回的数据,这样您就可以知道它何时完成响应并处理错误消息和数据。必须有相应的模块(可能是核心模块IPC::Open3IPC::Open2)。

【讨论】:

    【解决方案2】:

    为什么不使用DBI 而不是shell 脚本?然后,您可以保持连接并尽可能长时间地重复使用现有连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 2021-07-21
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多