如何在bash中使用csh脚本来设置环境

Dan*_*iel 18 bash csh

我们在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)


Dav*_*ein 6

像这样定义一个名为 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)