screen 的默认环境是 /bin/sh,而它应该是 /bin/bash?

mon*_*rix 2 bash gnu-screen environment-variables

我正在尝试调用一个程序在 /etc/rc.local 中启动时运行,该程序运行两个命令:

  1. 使用启动一个分离的屏幕 screen -dmS name
  2. 使用 screen -S name -X stuff command

然而,该命令依赖于设置的环境变量。我已经在根 .profile 和根 .pam_environment 文件中设置了这些 EXPORT 命令。作为参考,它们是:

export PATH=$PATH:/usr/local/cuda-7.0/bin

export LD_LIBRARY_PATH=:/usr/local/cuda-7.0/lib64

但是,启动屏幕无法看到这些变量和错误error while loading shared libraries: libcudart.so.7.0: cannot open shared object file: No such file or directory- 如果未设置这些变量,这就是我所期望的。

问题是我不明白为什么没有设置它们。我最好的猜测是,出于某种原因,屏幕正在使用/bin/sh(这是它报告的内容,如果 I echo $0,而根的默认外壳是/bin/bash

更奇怪的是,这只发生在启动时像这样实例化的屏幕。如果我使用相同的命令来启动一个分离的屏幕,它会正常工作(并使用 /bin/bash)并且环境变量没有问题。

知道是什么原因造成的以及如何解决吗?我正在使用Ubuntu 14.04 LTS.

cho*_*oba 7

也许你$SHELL没有设置或设置为/bin/sh?或者你的文件中有一个shell设置?/bin/sh.screenrc

请参阅screen的文档:

-s program
Run Code Online (Sandbox Code Playgroud)

将默认 shell 设置为指定的程序,而不是环境变量中的值 $SHELL (或者 /bin/sh 如果未定义)。这也可以通过shell .screenrc命令定义。另见那里。

还有:

shell command

设置用于创建新 shell 的命令。这会覆盖环境变量的值$SHELL。如果您想运行一个 tty-enhancer 来执行$SHELL. 如果命令以-字符开头 ,shell 将作为登录shell 启动。典型的 shell 在不作为登录 shell 启动时只进行最少的初始化。例如 Bash 不会读取你的, ~/.bashrc除非它是一个登录外壳。


.screenrc在您的主文件夹中添加以下行应该将屏幕的默认外壳设置为bash

shell /bin/bash
Run Code Online (Sandbox Code Playgroud)

  • 在 docker 容器内运行“screen”时,我遇到了同样的问题。“$SHELL”设置为“/bin/bash”,我有一个“.screenrc”,其中包含“shell $SHELL”行,但新的屏幕会话仍然使用“/bin/sh”。最后,在我的“.screenrc”中显式设置“shell /bin/bash”意味着屏幕以 bash 启动,新的屏幕会话也是如此。 (2认同)