/etc/profile
可以由交互式登录模式调用sh
并dash
在交互式登录模式内调用。/etc
交互非登录模式下目录下是否有需要调用的文件?
答案1
shell dash
(sh
如果由 实现)在作为登录 shell 启动时dash
读取。/etc/profile
然后它读到~/.profile
。该~/.profile
文件可以设置和导出ENV
环境变量。此变量应保存由非登录 shell 获取的文件的路径。这通常是在逐个用户的基础上完成的,而不是在/etc
.
从dash
手册(我的重点):
如果环境变量
ENV
是在进入交互式 shell 时设置的,或者是在.profile
登录 shell 中设置的,则 shell 接下来会从名为 的文件中读取命令ENV
。 因此,用户应该将仅在登录时执行的命令.profile
以及为每个交互式 shell 执行的命令放置在该ENV
文件中。 要将ENV
变量设置为某个文件,请将以下行放在您.profile
的主目录中ENV=$HOME/.shinit; export ENV
替换为
.shinit
您想要的任何文件名。
当从其他 shell 或进程调用sh
或创建交互式非登录 shell 会话时,只需确保将其设置为适当的 shell 初始化文件即可。这可以从任何 Bourne 类型的 shell 中使用来完成dash
ENV
ENV="$HOME/.shinit" sh
或者
ENV="$HOME/.shinit" dash
答案2
关于这些命令的另一件事是:它们都调用 /bin/sh(通常是类 UNIX 系统上的 dash shell),但它们将其作为登录 shell 调用,而不是交互式 shell。因此 ENV 指向的文件将不会被执行,只会执行硬连线的 /etc/profile 和 ~/.profile。
为了读取 ENV,似乎您必须将“sh -i -c ”放在 shell 命令前面,并引用 -c 之后的命令。
sh_command = 'sh -i -c "' + command + ' ' + args.join(' ') + '"'
env = { 'ENV' => Your.shellrc_file }
std_out, std_err, status = Open3.capture3(env, sh_command)
然后,您将遭受登录 shell 调用交互式 shell 的轻微低效,但 ENV 将不再被忽略。如果您更喜欢 bash,这还允许您更改 sh->bash 或 ksh 或 zsh 或 Fish 等。