2012-12-20 26 views
8

我试图编写一个.screenrc文件,我可以使用它来设置特定项目的开发 - 它将启动几个屏幕,cd到正确的位置,打开编辑器中的正确文件,并设置测试所需的一些环境变量。在.screenrc中设置环境变量

我不能让环境的设置工作。我已经试过把这个在`~/.screenrc

setenv PATH ~/src/my_proj/bin/:$PATH 

这不工作,我认为问题是,经过screenPATH,常规的shell初始化脚本启动并在我上面进行更改。

我不想禁用常规shell初始化脚本。有没有什么办法让屏幕setenv之后的shell初始化?或者,也可以将屏幕设置为只读变量?

回答

1

screen没有办法在进程启动后更改shell进程的环境变量,也没有办法让环境变量为只读值(值存储在每个进程的内存中,每个进程都有完全访问它们)。

(当然,可能有一些丑陋的系统特定的方式做到这一点,但它的那种东西类Unix系统的设计让你做。)

你需要修改shell的初始化脚本,以便它保留现有值$PATH,可能会添加到它,而不是将其设置为某个新值,而忽略其现有值。

如果要有条件地执行此操作,则可以测试$STY的存在性,它仅在外壳(或任何其他进程)在screen下运行时才会设置。

另外,screensetenv命令似乎不认可~字符。我尝试添加类似setenv到临时screenrc,并且$PATH包含文字~字符。 bash似乎认识到$PATH中的~语法,但其他shell不支持。用$HOME代替~screen确实认可。

5

我会用一些bash魔法来代替它。尝试添加这样的事情你~/.screenrc文件:

screen -t "window" bash -ic 'PATH=~/src/my_proj/bin/:$PATH bash' 

欲了解更多详情,并使用Ctrl-a Ctrl+cCtrl-a c有这套新创建的窗口看到我的回答对不同的职位:https://stackoverflow.com/a/21717641/1413849

+0

我有这个解决方案的问题是,它经常shell初始化的东西覆盖此。例如,我修改〜/ .bashrc中的PATH,这会破坏这个。 – ajwood

+0

它不应该抹掉所做的更改,因为它们应该只是将内容添加到现有的环境变量中,尤其是PATH。应该发生的最糟糕的情况是,如果他们做了如下的事情:'PATH = $ PATH:/ some/other/dir'或'PATH =/some/other/dir',因为你无法设置'/ some/other/dir“优先于其他目录。有没有一个更具体的例子,这样做会导致问题? –

1

我行

setenv PATH /home/someuser/bin:$PATH 

在screenrc文件中做的伎俩。

我认为'〜'扩展到'/ home/someuser'是bash特有的,并且不能在screenrc中工作。

0

对于我来说,我只设置环境~/.bash_profile~/.bashrc

case $TERM in 
screen*) 
    export PS1='[\u:screen \w]\$ ' 
    ;; 
*) 
    export PS1='[\u \w]\$ ' 
    ;; 
esac 

它的工作,很享受。

+0

这与Keith Thompson的答案类似,除了他建议使用'$ STY'存在而不是'$ TERM =='screen'' – ajwood