我们在Solaris上运行Oracle,默认情况下shell是csh.所以登录脚本也在csh中设置oracle_home,oracle_sid.但是我不喜欢csh而且想用bash来完成我的工作.那么如何在bash中获取csh登录脚本呢?
例如,以下是.cshrc文件中的内容.当使用bash时,我想使用这些变量.一种方法是再次复制变量并使用bash命令,例如export ORACLE_SID = TEST.但这样做需要我们维护两份文件.当我们更改数据库名称或升级数据库时,我需要单独维护bash登录文件.只是使用像这样的东西真好
在bash中使用.cshr,但它不起作用.
setenv ORACLE_SID TEST setenv ORACLE_HOME /oracle/TEST/home/products/10204 setenv EPC_DISABLED TRUE setenv MANPATH /usr/local/man:/usr/share/man setenv EDITOR vi setenv LD_LIBRARY_PATH $ORACLE_HOME/lib:/usr/sfw/lib/64 setenv NLS_LANG AMERICAN_AMERICA.UTF8 setenv NLS_DATE_FORMAT "DD-MON-RR"
Pau*_*ce. 17
在您~/.bashrc(或第一~/.bash_profile,~/.bash_login以及~/.profile存在)源此脚本使用类似. ~/bin/sourcecsh:
#!/bin/bash
# This should be sourced rather than executed
while read cmd var val
do
if [[ $cmd == "setenv" ]]
then
eval "export $var=$val"
fi
done < ~/.cshrc
Run Code Online (Sandbox Code Playgroud)
这个版本消除了邪恶eval:
#!/bin/bash
# This should be sourced rather than executed
# yes, it will be sourcing within sourcing - what so(u)rcery!
source /dev/stdin < \
<(
while read cmd var val
do
if [[ $cmd == "setenv" ]]
then
echo "export $var=$val"
fi
done < cshrc
)
Run Code Online (Sandbox Code Playgroud)
编辑:
没有stdin:
while read cmd var val
do
if [[ $cmd == "setenv" ]]
then
declare -x "$var=$val"
fi
done < cshrc
Run Code Online (Sandbox Code Playgroud)
像这样定义一个名为 setenv 的函数怎么样
setenv() {
echo setting $1 to $2
export $1=$2
}
Run Code Online (Sandbox Code Playgroud)
然后获取 .cshrc 文件。
当我在 bash 中执行此操作时,我得到
[dws@oxygen ual-read-only]$ source cshrc
setting ORACLE_SID to TEST
setting ORACLE_HOME to /oracle/TEST/home/products/10204
setting EPC_DISABLED to TRUE
setting MANPATH to /usr/local/man:/usr/share/man
setting EDITOR to vi
setting LD_LIBRARY_PATH to /oracle/TEST/home/products/10204/lib:/usr/sfw/lib/64
setting NLS_LANG to AMERICAN_AMERICA.UTF8
setting NLS_DATE_FORMAT to DD-MON-RR
[dws@oxygen ual-read-only]$ env | grep ORACLE
ORACLE_SID=TEST
ORACLE_HOME=/oracle/TEST/home/products/10204
Run Code Online (Sandbox Code Playgroud)