在GNU Screen中,如何创建一个新窗口,其shell继承当前窗口中shell的环境?
通常的Ctrl+A C似乎没有这样做。
答案1
如果您在一个屏幕上设置了环境变量(例如运行 bash),然后打开一个新屏幕,则它是一个单独的 bash 进程,因此不会在单独的已运行的 bash shell 上获取环境。解决该问题的快速解决方案是:
env TERMCAP= env | sed -r 's/^(\w+)=(.*)$/\1="\2"/' > env.sh
然后一旦你必须Ctrlac得到一个新的外壳你就可以
source env.sh
我之所以使用它是env TERMCAP= env
因为 TERMCAP 环境变量是多行的,并且使事情变得sed
更加复杂。它不漂亮,但它有效:)
您可能想要更改它以执行以下操作:
env TERMCAP= env | sed -r 's/^(\w+)=(.*)$/export \1="\2"/' > env.sh
所以变量也被导出。
答案2
导出的变量,如 所示,env
应该自动被您的新screen
.
但是,在启动之前在 shell 中定义screen
但尚未导出的局部变量将不会存在于 screen 会话中。
根据您命名变量的方式,您可以在 Bash 中使用类似的内容来获取可读列表:
(set -o posix ; set) | egrep -v '^(_.*|[A-Z0-9_]+)='
set
其本身也会列出大量功能。
(set -o posix ; set)
将仅列出变量,但该列表中有大量系统变量。
egrep -v '^(_.*|[A-Z0-9_]+)='
过滤掉名称以下划线开头的所有变量,以及所有仅包含大写字母、数字和下划线的变量。这应该消除大多数系统变量。
因此,该列表仅限于也(或仅)使用小写字母(以及下划线和数字)的变量。现在,您可以在启动屏幕之前从该列表中复制所需内容,并将其粘贴到那里。
当然,只有当您有许多忘记导出的变量时,这才有用,但您一定记得在启动屏幕之前检查它们......