我如何(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
我是一个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 ...
答案 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进程。