后台:我需要将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本身在不同平台上的工作方式不同。
有人能看出为什么两个系统上的相同输入有不同的响应吗?知道如何更改管道以使其工作吗?
由于
答案 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)了解用法和 描述