如何让csh获取文件然后进行交互?

时间:2012-01-24 05:12:31

标签: csh

附图

我如何(1)启动一个新的csh,(2)强制它执行一些不在任何.cshrc中的命令(尽管我可以安排它们在非标准位置作为源' ed)和(3)然后进行互动?

E.g。是否有任何方法可以让csh或tcsh起诉除http://www.manpagez.com/man/1/tcsh/所述之外的其他启动文件,其中说明

我已经知道了

启动和关闭        登录shell首先执行系统文件中的命令        /etc/csh.cshrc和/etc/csh.login。然后它执行命令        用户主目录中的文件:first~ / .tcshrc(+)或if        找不到〜/ .tcshrc,〜/ .cshrc,然后〜/ .history(或者它的值)        histfile shell变量),然后是〜/ .login,最后是〜/ .cshdirs(或者        dirsfile shell变量的值)(+)。 shell可能会读        /etc/csh.login之前而不是/etc/csh.cshrc和〜/ .login        之前而不是〜/ .tcshrc或〜/ .cshrc和〜/ .history之后,如果是这样的话        编制;看到版本的shell变量。 (+)

   Non-login  shells read only /etc/csh.cshrc and ~/.tcshrc or ~/.cshrc

DETAIL

我是一个bash用户。但我在一家硬件公司工作,其中(1)许多人都是csh用户,(2)许多CAD工具依赖于环境中的东西,例如模块系统。

许多食谱 - 例如人们解释如何做事的内部维基页面 - 从

开始
start a new shell or xterm
source /proj/Foo/setup.proj
source ~some_engineer/env/setup-for-this-tool
now run the tool

环境变量经常发生冲突;有时候我必须删除所有的〜/。*文件,重新删除ssh等等。

我想自动化其中许多。实际上,我已将其中许多自动化。但是,我必须使用expect(实际上是Perl CPAN Expect)自动化它们,以伪装成交互式用户。

一路上,我有自己的脚本clear-env,我经常使用它来启动一个几乎没有环境变量的shell。因此使用:

clear-env -keep HOME -- csh
and then either pipe commands in through expect
or run interactively

这适用于自动化。但有时候我确实需要进行交互 - 但只有在我加载了几行长源脚本名称后才能实现。

我希望能够加载源文件,然后再回到交互式文件中。

E.g。我试过了

clear-env -keep HOME -- csh -c 'source filename' -i
...

或者,没有我的clear-env

csh -c 'source filename' -i
...

希望它会执行-c命令然后变为交互式。但它只执行-c命令。

我已经能够通过我自己的perl脚本将命令提供给csh,它读取我的tty,然后通过expect将命令传递给csh。但是,我失去了csh的交互功能。

还有更好的方法吗?一些说法“从现在开始,我想让你把你的控制终端重新连接到另一个终端?”

感谢。

顺便说一句,这对其他shell也很有用。但是,根据我的经验,csh用户最容易编写必须手动执行的配方。

-

也许我不清楚:

我知道

 exec tcsh -c "source stuff ; exec bash"

和      exec csh -c“source stuff; exec csh”

情况是我已经通过Expect使用“交互式”命令驱动了工具,脚本很长的路。

现在,在我完成了伪交互式设置后,终于我想恢复真正的互动。基本上,将shell的控制终端从Expect正在使用的pty更改为真正的pty。

我已经能够通过创建转发流程来实现这一目标。

但我希望能切换。或者做一些像

这样的事情
... long
... sequence
... of expect commands
exec csh -i < /dev/my-pty ...

5 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。您可以使用expect执行此操作。关键是声明interact

#!/usr/bin/env expect

spawn tcsh

expect {
  > {
    send "cd /some/path/foobar\n"
  }
}
interact

...当然,如果>在您的提示中。这是使用expect的主要问题,但有时你会陷入无其他出路的情况。

此外,您可能希望采取措施不使用脚本命令污染.history文件,但您可能已经意识到这一点。

答案 1 :(得分:1)

我遇到了同样的问题。我使用的是bash,并且有一个软件包,只有在csh提示符下才会生效,并且会找到一个名为nemo_start的文件。这是解决方案:

me@machine:~/nemo$ csh -c "source nemo_start; csh" # This is bash.
FALCON set to /home/me/nemo/usr/dehnen/falcON
machine:~/nemo% tsf                                # This is csh already.
Insufficient parameters, try 'help=', 'help=?' or 'help=h' or 'man tsf',
Usage: tsf in=??? ...
type contents of a (binary) structured file

除非文件来源正确并且保留了环境变量和别名,否则此tsf命令将不可用。

答案 2 :(得分:0)

我设法通过将 $ HOME 设置为其他目录,然后在新的 $ HOME 中添加 .cshrc 做你想做的,然后将 $ HOME 设置回〜$ USER 并手动输入 $ HOME / .cshrc

感觉非常讨厌,但似乎有效。要注意其他像。文件 .history 这样的dotfiles可能会被打破,具体取决于shell中的启动顺序,但是如果你绝望并希望避免使用 expect ,那么这是一个想法。

我在登录共享测试帐户时开始使用它来共享我自己用户的 .cshrc ,使用以下内容:

xterm -e "setenv HOME ~spickup; exec csh -l" &

(当然,在这种情况下,您需要帐户之间的开放权限,因此请勿在安全系统上执行此操作。)

类似的原则可能适用于 bash 或其他shell。

答案 3 :(得分:0)

这可能无法解决您的问题,但如果您的目标是自动化某个来源&#34;,那么您可以将其置于别名中:

〜/ .aliases

alias mysource 'source /path/to/source/file.rc'

答案 4 :(得分:-1)

exec tcsh -c "source stuff ; exec bash"

'source stuff'应该用(csh)shell脚本替换,这会让你进入一个bash shell,继承tcsh中由'source stuff'设置的环境。 'exec意味着你最终不会使用嵌套的shell进程。