如何让GNU screen读取.bash_profile/.bash_rc的更改?

46

在我修改了.bash_rc.bash_profile文件后,启动GNU Screen时它没有注意到这些更改。

我可以

source ~/.bash_profile

这个命令适用于我当前打开的屏幕窗口,但我需要对每个打开的屏幕窗口重复执行此操作。

如何让 screen 读取我的最新 bash 配置更改?


1
将采纳的答案改为Mike提供的另一个(正确的)答案如何? - dotz
实际上,gpojd的被接受答案是很好的。如果您正在作为根用户在服务器上工作,那么非常有用的一点是能够执行ctrl-a :at "#" stuff "source .gn/bashrc^M"命令并运行个人根bashrc(从取消别名rm cp mv开始),并使所有窗口都来源于个性化的rc文件。请注意,^M是两个字符抵消和M。 - Graham Nicholls
2个回答

75

如果你希望 screen 总是将你的 shell 视为登录 shell,并且加载与通常启动新 shell 时相同的文件,请将以下内容添加到 ~/.screenrc(或者根据评论中的指示,可能是 ~/.byobu/.screenrc):

shell -$SHELL

这样,您就不需要每次启动新的屏幕时手动告诉它要获取您的文件。但是如果您刚刚进行了更改并希望在当前屏幕中反映这些更改,则必须手动告诉它。

您可以在此处找到有关此功能(以及许多其他屏幕详细信息)的文档。基本上,shell是向屏幕发送的一条命令,告诉它在需要创建新外壳时运行以下内容。$SHELL是通常保存路径的变量,指向您首选的 shell,前面的短横线 - 表示将其作为登录 shell 运行(通常意味着它会调用您的 ~/.bash_profile 等)。

然而,值得指出的是,屏幕默认只从您启动屏幕的 shell 继承大多数环境变量;登录子 shell 可能会以意想不到的方式更改某些环境变量。我遇到过一个问题,其中我的 $PATH 的某些元素基本上被排列。感谢 superuser 上特别好的答案,我解决了这个问题。

您可能会注意到可用的 source 命令。值得注意的是,这将源化一个 screen 命令文件,而不是 shell 命令。其他相关(屏幕)命令包括evalexec


1
在我的情况下,需要编辑的.screenrc文件位于.byobu/.screenrc。RHEL6 - Scott Rowley

17

你需要在每个屏幕上都执行此操作,因为它们都是不同的shell。如果你希望每次打开新的shell时都生效更改,建议将更改放在~/.bashrc中。

很显然,你可以使用这个语法一次向所有窗口发送命令:

C-a :
at "#" stuff "source ~/.bash_profile^M"

我能够为所有打开的屏幕窗口获取.bash_profile文件,但对于任何我打开的新屏幕窗口都不起作用。当我启动新的屏幕会话时,它也没有加载所有新的.bash_profile数据。 - Francis Lewis
5
我不知道我为什么要放那个。.bash_profile 只在您第一次登录时被调用,而 .bashrc 则每次打开 shell 时都会被执行。如果您希望每次都执行,请将更改内容放在 .bashrc 中而不是 .bash_profile。 - gpojd
那个完美地运行了!非常感谢!我仍然认为将东西放在.bash_profile中会在我登录时加载,但事实并非如此。 - Francis Lewis
好的,它已经加载到您的登录 shell 中了,但如果在您进行更改之前启动了 screen,则除非您完全关闭 screen 并从新的登录 shell 开始一个新的 screen,否则更改不会生效。 - Random832
我有一个巨大的.bash_profile,这给我的WinSCP(和可能是Filezilla)带来了问题。应该使用@mike下面的解决方案(在~/.screenrc中使用shell -$SHELL)。 - laggingreflex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接