Red Hat/CentOS/Unix终端执行Oracle多命令失败求助
解决Red Hat/CentOS中
echo SID | . oraenv && lsnrctl status失效的问题 我碰到过一模一样的问题!核心原因是管道会创建子shell,导致oraenv设置的环境变量无法传递到后续命令。
问题根源
当你用echo deltaasm | . oraenv时,. oraenv是在管道创建的子shell里执行的——它设置的ORACLE_HOME、更新的PATH这些环境变量只存在于那个子shell中,执行完就消失了。而后面的lsnrctl status是在你的主shell里运行的,根本看不到这些新设置的环境变量,自然会报bash: lsnrctl: command not found。
而你分步执行时,. oraenv直接在主shell里生效,环境变量被保留,所以lsnrctl能正常运行。至于Ubuntu看起来正常,大概率是巧合(比如你的Ubuntu环境里Oracle的bin路径本来就在全局PATH里,或者oraenv的实现细节不同),但本质上这种管道写法在大多数POSIX shell里都不推荐。
解决方案
这里有两个可靠的方法,都能让oraenv在当前shell中生效:
方法1:用Here-string传递SID(最简洁)
Here-string不会创建子shell,直接在当前shell中给oraenv提供输入:
. oraenv <<< deltaasm && lsnrctl status
方法2:预先设置ORACLE_SID环境变量
oraenv脚本会优先读取已设置的ORACLE_SID,不会再弹出交互提示。直接在命令前设置变量,让oraenv自动使用这个值:
ORACLE_SID=deltaasm . oraenv && lsnrctl status
验证效果
用上面任意一种方法执行后,你应该能看到和分步执行一样的结果:
ORACLE_SID = [oracle] ? The Oracle base has been set to /u01/app/oracle LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 23-MAY-2018 03:07:04 Copyright (c) 1991, 2013, Oracle. All rights reserved. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production Start Date 23-MAY-2018 02:34:56 Uptime 0 days 0 hr. 32 min. 8 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Log File /u01/app/oracle/diag/tnslsnr/DeltaLinOraASM2/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=DeltaLinOraASM2)(PORT=1521))) The listener supports no services The command completed successfully
内容的提问来源于stack exchange,提问作者Kailas Kakade
相关产品推荐
相关产品推荐

