2012-11-23 50 views
0

背景:我需要將ksh腳本從SunOS 5.10移植到RHEL 5.8。它調用isql來檢索一些數據,並且與最終端點客戶端實用程序(如isql)的預期應用程序相反,它會將其解析出來供shell腳本中的變量使用。請注意,我只是繼承了這一點,決不會自己設計這樣的黑客。我肯定永遠不會解析isql以將值賦給shell中的var - 如果腳本需要這些信息,我會使用Perl來處理一些API,比如DBD :: DBI,用於編寫應用程序和數據存儲之間的數據。但我擁有我所擁有的並且必須在參數範圍內工作。同一管道調用isql在Solaris上工作,但不在RHEL上

正在發生的事情是,下面的管道輸入並返回在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本身在不同平臺上的不同工作方式。

任何人都可以看到爲什麼對這兩個系統上的相同輸入有不同的響應?任何想法如何改變管道使其工作?

感謝

回答

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的手冊頁:

當第一個參數不以 - 開頭,並沒有一個 參數包含一個\,然後回顯打印它的每個參數 由空格分隔並以換行符結尾。 否則, 回聲的行爲取決於系統,應使用下面所述的print或printf 。請參閱echo(1)的使用說明和 說明。

+0

做到了。你有任何想法,如果不可移植性是由於UNIX或Sybase的版本? – amphibient

+1

這是一個shell問題。從歷史上看,echo有兩個不兼容的實現,這個內置命令的行爲是依賴於系統的。創建printf是爲了提供處理控制字符的便攜方式。答案已更新。 – jlliagre

+0

關閉此修復的章節肯定會開始週末非常的甜蜜......非常感謝您的主席先生 – amphibient

相關問題