0

背景: 我需要将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 本身在不同平台上的工作方式不同。

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

谢谢

4

1 回答 1

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)。

于 2012-11-23T23:36:26.930 回答