/etc 目录中是否有 dash 和 sh 作为非登录 shell 的调用文件?

/etc 目录中是否有 dash 和 sh 作为非登录 shell 的调用文件?

/etc/profile可以由交互式登录模式调用shdash在交互式登录模式内调用。/etc交互非登录模式下目录下是否有需要调用的文件?

答案1

shell dashsh如果由 实现)在作为登录 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 中使用来完成dashENV

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 等。

相关内容