【发布时间】:2014-09-26 04:26:51
【问题描述】:
使用 bash,您可以将 ~/.bashrc 文件设置为在每次创建新的 bash shell 时运行一些东西。是否可以用 /bin/sh 做同样的事情? (顺便说一下,这是在 Debian 上)。
现在,我只想在调用 /bin/sh 时回显“I am sh”。在 bash 中很容易做到(“echo 'I am bash'”放在文件顶部)。
谢谢!
【问题讨论】:
使用 bash,您可以将 ~/.bashrc 文件设置为在每次创建新的 bash shell 时运行一些东西。是否可以用 /bin/sh 做同样的事情? (顺便说一下,这是在 Debian 上)。
现在,我只想在调用 /bin/sh 时回显“I am sh”。在 bash 中很容易做到(“echo 'I am bash'”放在文件顶部)。
谢谢!
【问题讨论】:
当启动 dash 的登录 shell(在类似 debian 的系统上为 /bin/sh)时,它将读取 ~/.profile。如果您还想为交互式非登录 shell 读取配置文件,请将以下行添加到您的 ~/.profile 文件中:
ENV=$HOME/.shinit; export ENV
然后,随着变量ENV 出现在环境中,文件$HOME/.shinit 将与每个新的交互式(破折号)shell 一起获取。
您可以将ENV指定的文件名更改为您喜欢的任何文件名。
为确保破折号登录 shell 已将 ENV 添加到环境中,您可能需要注销并重新登录,或者可能需要重新启动,具体取决于您的系统设置。
这记录在man dash:
登录外壳首先读取 来自文件 /etc/profile 和 .profile 的命令(如果存在)。如果环境变量 ENV 在进入交互式 shell 时设置,或者在登录 shell 的 .profile 中设置,shell next 从以 ENV 命名的文件中读取命令。因此,用户应该放置以下命令 仅在登录时在 .profile 文件中执行,以及每次执行的命令 ENV 文件中的交互式 shell。
假设我们的文件设置如下:
$ echo "ENV=$HOME/.shinit; export ENV" >>~/.profile
$ cat .shinit
echo FOUND ME
由于我刚刚将ENV 行添加到~/.profile 文件中,因此ENV 尚未在环境中。如果我们运行dash:
$ dash
$
没有发生任何事情,因为这是一个非登录 shell,并且ENV 尚未在环境中。
如果我们启动一个登录 shell,ENV 被放置在环境中,~/.shinit 被运行:
$ dash -l
FOUND ME
如果作为该 shell 的子代,我们运行交互式非登录 shell,则 ~/.shinit 将运行,因为父 shell 创建了 ENV 变量:
$ dash
FOUND ME
上面登录 shell 创建的环境只影响其子级。如上所述,为确保所有交互式dash shell 在其环境中具有ENV,可能需要注销并重新登录,或者重新启动。
【讨论】: