21

我们在 Solaris 上运行 Oracle,shell 默认为 csh。所以登录脚本也会在 csh 中设置 oracle_home、oracle_sid。但是我不喜欢 csh 并且想使用 bash 来完成我的工作。那么如何在 bash 中获取 csh 登录脚本呢?

例如,以下是 .cshrc 文件中的内容。当使用 bash 时,我想使用这些变量。一种方法是再次复制变量并使用 bash 命令,例如 export ORACLE_SID=TEST。但是这样做需要我们维护两个文件的副本。而当我们更改数据库名称,或者升级数据库时,我需要单独维护 bash 登录文件。很高兴只使用类似的东西

source .cshr 在 bash 中,但它不起作用。

setenv ORACLE_SID 测试
setenv ORACLE_HOME /oracle/TEST/home/products/10204
setenv EPC_DISABLED TRUE
setenv MANPATH /usr/local/man:/usr/share/man
setenv 编辑器 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"
4

9 回答 9

19

在您的~/.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

这个版本消除了邪恶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
)

编辑:

没有采购标准输入:

while read cmd var val
do
    if [[ $cmd == "setenv" ]]
    then
        declare -x "$var=$val"
    fi
done < cshrc
于 2010-04-26T02:41:31.240 回答
6

像这样定义一个名为 setenv 的函数怎么样

setenv() {
  echo setting $1 to $2
  export $1=$2
}

然后采购 .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
于 2011-11-17T18:00:45.290 回答
4

我在同一条船上。一位同事向我展示了以下内容:

从 bash 开始,没有环境中的东西:

bash> echo $$
12632
bash> echo $FOO

这是获取源代码的 csh 文件:

bash> cat setup-env.csh
setenv FOO "some csh stuff"
echo FOO=$FOO in csh

这是命令:

bash> csh -c 'source setup-env.csh;exec bash'

查看 csh 的输出

FOO=some csh stuff in csh

并查看新 bash shell 的输出

  bash> echo $$
  13487
  bash> echo $FOO
  some csh stuff

现在离开,回到原来的 bash shell

bash> exit
exit
bash> echo $$
12632
bash> 

注意 echo $$ 以查看进程 ID,以便我们可以看到它们是不同的 shell 进程。

我的同事使用它足够多,以至于他将其放入别名中,例如:

# make csh environment scripts useable (sourceable) from bash function 
# from Phil McCoy, Wed Nov  9 2011
source_csh () {
   exec csh -c " source $*; setenv ALREADY_SOURCED \"$ALREADY_SOURCED:$*:\"; exec bash"
}
# sounds like a great idea to do source_csh .cshrc or .login
# but naively done is infinitely recursive, 
# since the exec'ed bash will run .bashrc

不幸的是,我发现我经常不仅需要设置环境变量,还需要设置别名,就像在模块包http://modules.sourceforge.net/中一样。

通过使用 Perl Expect,我已经能够自动化这个“csh 源脚本配方”。但除了上述之外,我还不能像我想要的那样进行交互。

于 2012-01-24T05:23:16.247 回答
2

我能想到的唯一方法是加载 csh 然后从那个新的 shell 调用 bash 。这样 csh 可以解析该文件,然后它产生的 bash 也将继承该环境。

于 2010-04-26T02:26:50.817 回答
2

在您的 bash.profile中,您可以执行以下操作:

cat .cshrc | sed 's/setenv\s+(\S+)\s+(.*)$/set $1=$2; export $1/' > $HOME/.env_from_csh
source $HOME/.env_from_csh
于 2010-04-26T02:47:43.673 回答
0

有一个可用的模块,您可以通过它在 perl 脚本中的任何地方获取相同的文件。您将在 csh 文件中获得所有可用的环境路径。

Source::Shell

通过一些文档了解它的用法。

于 2013-07-10T05:49:35.627 回答
0

对于这么小的东西,通常维护两个设置脚本,一个用于 sh 和 sh 派生的 shell,另一个用于 csh 和 tcsh。正如您所提到的,这确实会产生两个脚本不同步的风险——除非您从另一个脚本生成一个,或者从一个公共源生成两个脚本。

这将负担放在了设置脚本的维护者身上,而不是每个需要使用它们的用户身上。

于 2012-01-24T05:35:45.507 回答
-1

只是#!/bin/tcsh在 CSH 脚本的开头有一个“”或类似的语句以及使脚本可执行,就为我解决了这个问题。在这种情况下,我可以直接从 bash 调用 CSH 脚本。

例如,我必须从名为 setup.sh 的 bash 脚本运行 tools.csh。我在 bash 脚本中做了这样的事情:

if [ -z \`head -1 tools.csh | grep '^#!'\` ];
then
   TCSH=\`which tcsh\`;
   echo "'#!'$TCSH" > tools.csh.temp;
   cat tools.csh >> tools.csh.temp;
   mv tools.csh.temp tools.csh;
fi;
chmod 755 tools.csh;
./tools.csh
# now I have all the setenv commands effective ...
于 2010-12-13T08:35:25.747 回答
-4

在 bash 中获取 csh 文件将不起作用。如果您在 bash 中更舒适,可以将默认登录 shell 从 csh 更改为 bash。您可以使用 chsh 或以管理员身份为您更改它。

chsh -s /usr/local/bin/bash 
于 2010-04-26T02:30:09.077 回答