如何从bash脚本中获取csh脚本

时间:2013-07-04 10:18:31

标签: shell-exec

我的默认shell是bash。我在.bashrc文件中设置了一些环境变量 我安装了一个使用.cshrc文件的程序。它包含几个cshell脚本的路径。 当我在shell窗口中运行以下命令时,它可以完美地运行:

 exec csh

 source .cshrc

 exec bash

我试图将这些命令放在bash脚本中,遗憾的是它没有用。 是否有另一种编写脚本的方法,以获得与从shell窗口运行命令相同的结果。 我希望我的问题现在清楚了 非常感谢您的帮助

2 个答案:

答案 0 :(得分:1)

警告:不要将以下脚本放在你的.bashrc中,它会重新加载bash,所以一次又一次地重新加载.bashrc(无论如何都要用C-c停止) 在kit / CDS stuff启动脚本中使用优选的此脚本。 (大概是韵律) 警告2:如果你的file2source中的任何内容都失败了,整个'技巧'停止。

调用此脚本:cshWrapper.csh

#! /bin/csh
# to launch using 
# exec cshWrapper.csh file2source.sh
source $1
exec  $SHELL -i

并使用

启动它
exec ./cshWrapper.csh file2source.sh

它会:启动csh,获取你的文件并回到同一个bash shell

示例:

$> ps
  PID TTY          TIME CMD
 7065 pts/0    00:00:02 bash
$>exec ./cshWrapper.csh toggle.csh
file sourced
1
$> echo $$
7065

在我的情况下,我使用文件toggle.csh

#! /bin/csh
# source ./toggle.csh
if ! $?TOGGLE then
    setenv TOGGLE 0
endif

if ($?TOGGLE) then
    echo 'file sourced'
    if ($TOGGLE == 0) then
        setenv TOGGLE 1
    else
        setenv TOGGLE 0
    endif
endif
echo $TOGGLE

希望有所帮助

答案 1 :(得分:0)

新提案,因为我遇到了exec的另一个问题。 exec 会杀死脚本中剩余的内容,除非你在`exec script | cat'之后使用管道强制执行fork。在这种情况下,如果脚本中有环境变量,它们不会传播回到脚本本身,这不是我们想要的。我找到的唯一解决方案是使用3个文件(让我们称之为示例: main.bash ,调用 first.cshrc second.sh )。

#! /bin/bash
#_main.bash_
exec  /bin/csh -c "source /path_to_file/cshrc; exec /bin/bash -i -c /path_to_file/second.sh"
# after exec nothing remains (like Attila the Hun)
# the rest of the script is in 'second.sh'

通过这种方式,我可以在一个脚本调用中启动一个旧的cshrc设计工具包,然后仍然处理一些bash命令,最后用bash启动主程序(比如说virtuoso)