【发布时间】:2012-09-01 05:42:58
【问题描述】:
我通常会在 Bash shell 脚本中内联编写 SQL 语句,以便在 SQLPlus as-中执行-
#! /bin/sh
sqlplus user/pwd@dbname<<EOF
insert into dummy1
select * from dummy2;
commit;
exit;
EOF
这可以正常工作,并在执行时将行插入dummy1。前几天我的一位同事带着如下脚本来找我(简化)
#! /bin/sh
sqlvar="insert into dummy1 select * from dummy2;commit;"
echo $sqlvar|sqlplus user/pwd@dbname
这个问题是在执行时变量sqlvar 将* 扩展为当前目录中的所有文件,最终会出错-
SQL> insert into dummy1 select <--all the file names in the current directory-->
from dummy2;commit
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
我们对此的第一个立场是 shell 在通配符上下文中解释 * 并在 shell 变量扩展时列出所有文件名(不太清楚为什么......???)。所以,为了理解这一点,我们做了如下的事情-
$ var="hello *"
$ echo $var
hello <--all the file names in the current directory-->
但是
$*
ksh: somefile.sh: 0403-006 Execute permission denied. #since it had no execute permission
目录中还有许多其他文件,我不知道为什么* 选择执行somefile.sh 或指向somefile.sh。
经过一番挖掘,我们意识到,使用set -o noglob 可以完全解决这个问题,比如-
#! /bin/sh
set -o noglob
sqlvar="insert into dummy1 select * from dummy2;\n commit;"
echo $sqlvar|sqlplus user/pwd@dbname
在互联网上有一些对setting noglob 的相互矛盾或相当矛盾的描述。所以我正在寻找是否有人可以解释这一点的诀窍。
【问题讨论】: