2009-09-29 68 views
0

我的ruby脚本需要连接到Oracle数据库。所以我需要在脚本运行之前正确地导出ORACLE_HOME和LD_LIBRARY_PATH。有没有一种方法可以在不使用shell脚本的情况下导出这些env变量?我试图把ENV ['ORACLE_HOME'] ='/ usr/local/oracle_client'放在脚本的第一行,它不起作用。 现在唯一可行的方法是编写一个shell脚本,在那里导出这些变量,然后在那里运行ruby。 shell脚本的样子:如何自动导出运行ruby脚本所需的oracle环境变量?

出口ORACLE_HOME = '在/ usr /本地/ oracle_client' 出口LD_LIBRARY_PATH = '在/ usr /本地/ oracle_client/lib目录' 红宝石myscript.rb --options

这是有点丑因为用户必须进入shell脚本来更改选项。我想知道是否有更好的方法来做到这一点。所以用户可以在命令行下执行:ruby myscript.rb --options

回答

1

为什么不提供ruby选项作为shell脚本的参数?例如,

#!/bin/bash  
export ORACLE_HOME='/usr/local/oracle_client' 
export LD_LIBRARY_PATH='/usr/local/oracle_client/lib' 
ruby myscript.rb $* 

很明显,您可能想要添加论证合理性检查等,但这给出了这个想法。

+0

因为他不是他的剧本的消费者,所以最好保存clinets这样的conf ... – khelll 2009-09-29 22:10:47

+0

你是什么意思客户端配置? OP说这个脚本很难看,因为用户必须修改脚本来提供选项。这个答案解决了这个问题。它提供的命令行解决方案不比运行ruby命令更复杂。它还增加了价值,因为默认选项和验证可以在shell脚本中完成。 – DCookie 2009-09-29 23:06:07

+0

它工作,感谢DCookie。 – swingfuture 2009-09-30 17:16:50

1

为什么不通过Kernel.system来调出呢?

system("export ORACLE_HOME='/usr/local/oracle_client'") 
system("export LD_LIBRARY_PATH='/usr/local/oracle_client/lib'") 
+0

你的意思是我把这些行放在脚本的顶部?我试过了,但是当我打印env变量(放入ENV ['ORACLE_HOME'])时,它们仍然是空的。 – swingfuture 2009-09-30 16:38:17

+0

它不起作用,因为,正如kernel.system的文档所述:“在子shell中执行cmd,...”。只要系统调用完成,子shell就会退出(因此它的环境已经消失),并且您又回到了原点。 – DCookie 2009-09-30 17:42:46

+0

你真正需要的东西类似于Perl的Env模块,但我知道关于红宝石的zip,所以我不能说在这些线上有什么可用的东西...... – DCookie 2009-09-30 17:56:36