【问题标题】:Same piped call to isql works on Solaris but not on RHEL对 isql 的相同管道调用适用于 Solaris,但不适用于 RHEL
【发布时间】:2012-11-23 23:19:31
【问题描述】:

背景:我需要将 ksh 脚本从 SunOS 5.10 移植到 RHEL 5.8。它调用 isql 以检索一些数据,并且与 isql 等最终端点客户端实用程序的预期应用程序完全相反,它解析它以供 shell 脚本中的变量使用。请注意,我只是继承了这一点,我自己并没有设计过这样的 hack。我当然不会解析 isql 来为 shell 中的 var 赋值——如果脚本需要这些信息,我会使用 Perl 和一些 API,比如 DBD::DBI,这些 API 旨在在应用程序和数据存储之间编组数据.但我有我所拥有的并且必须在参数范围内工作。

发生的情况是,以下管道输入确实在 SunOS 上返回了数据,但在 RHEL 中却没有:

echo "SELECT some_field FROM some_table WHERE some_crtra = 'X' \ngo" | isql -U$USER -P$PASS -D$DB -S$SERVER

Solaris 上的输出是:

 some_field 
 ------
 Y

(1 row affected)

从那时起,脚本使用awk 仅从上述流中提取字段值,但我们忽略它,因为这不是问题。

另外请注意,我能够分别执行管道命令获取数据,即通过手动进入 isql 并运行 SQL。因此,SQL 或连接字符串不是问题——它要么是管道流数据的方式,要么是 isql 本身在不同平台上的工作方式不同。

任何人都知道为什么两个系统上对相同的输入会有不同的响应吗?知道如何更改管道以使其正常工作吗?

谢谢

【问题讨论】:

    标签: solaris ksh rhel isql


    【解决方案1】:
    echo "SELECT some_field FROM some_table WHERE some_crtra = 'X' \ngo"
    

    不可移植。

    我会建议:

    printf "SELECT some_field FROM some_table WHERE some_crtra = 'X' \ngo\n"
    

    来自 ksh93 手册页:

    当第一个 arg 不以 - 开头,并且没有 arguments 包含一个 \,然后 echo 打印它的每个参数 以空格分隔并以换行符结束。 否则, echo 的行为取决于系统和 print 或 printf 应该使用下面描述的。请参阅 echo(1) 了解用法和 描述。

    【讨论】:

    • 做到了。您知道不可移植性是由于 UNIX 还是 Sybase 的版本造成的吗?
    • 这是一个外壳问题。从历史上看,echo 有两个不兼容的实现,并且这个内置命令的行为取决于系统。创建 printf 是为了提供一种可移植的方式来处理控制字符。答案已更新。
    • 结束这个修复的章节肯定会让周末开始变得非常甜蜜......非常感谢你,先生
    猜你喜欢
    • 1970-01-01
    • 2020-12-22
    • 2019-12-27
    • 1970-01-01
    • 2011-02-07
    • 2022-10-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多