对isql的相同管道调用适用于Solaris,但不适用于RHEL

时间:2012-11-23 23:19:31

标签: solaris ksh rhel isql

后台:我需要将ksh脚本从SunOS 5.10移植到RHEL 5.8。它调用isql来检索一些数据,并且与最终端点客户端实用程序(如isql)的预期应用程序完全相反,它将其解析为由shell脚本中的变量使用。请注意,我刚刚继承了这一点,并没有自己设计这样的黑客。我当然永远不会解析isql out来为shell中的var赋值 - 如果脚本需要那些信息,我会使用Perl和一些像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本身在不同平台上的工作方式不同。

有人能看出为什么两个系统上的相同输入有不同的响应吗?知道如何更改管道以使其工作吗?

由于

1 个答案:

答案 0 :(得分:2)

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没有以 - 开头,而没有 参数包含\,然后echo打印其每个参数 由空格分隔并以换行符结束。的否则, echo的行为取决于系统和print或printf 应使用下面描述的内容。请参阅echo(1)了解用法和 描述