2

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

 exec csh

 source .cshrc

 exec bash

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

4

2 回答 2

1

新提案,因为我遇到了 exec 的另一个问题。 exec会杀死脚本中剩余的任何内容,除非您在 `exec script |cat' 之后使用管道强制分叉。在这种情况下,如果脚本中有环境变量,它们不会传播回脚本本身,这不是我们想要的。我找到的唯一解决方案是使用 3 个文件(我们将它们称为示例:main.bash调用first.cshrcsecond.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)

于 2015-12-15T08:58:26.863 回答
1

警告:不要将以下脚本放在您的 .bashrc 中,它会重新加载 bash 并一次又一次地重新加载 .bashrc(无论如何都可以使用 Cc 停止)在您的工具包/CDS 启动脚本中使用此脚本更可取。(大概是节奏)警告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,获取您的文件并返回相同的 parrent 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

希望能帮助到你

于 2015-12-08T15:11:15.493 回答