bcan Asked: 2018-09-18 05:43:54 +0800 CST2018-09-18 05:43:54 +0800 CST 2018-09-18 05:43:54 +0800 CST /etc 目录中是否有 dash 和 sh 作为非登录 shell 的调用文件? 772 /etc/profile可以在交互式登录模式sh中调用。当它们处于交互式非登录模式时dash,目录中是否有要调用的文件?/etc shell dash 2 个回答 Voted Best Answer Kusalananda 2018-09-18T06:42:15+08:002018-09-18T06:42:15+08:00 dashshell(sh如果由 实现)在作为登录 shell 启动时dash读取。/etc/profile然后它读取~/.profile。该~/.profile文件可以设置和导出ENV环境变量。此变量应保存由非登录 shell 提供的文件的路径。这通常是逐个用户完成的,而不是在/etc. 从dash手册(我的重点): 如果环境变量ENV在进入交互式 shell 时设置,或者在.profile登录 shell 中设置,则 shell 接下来从名为 in 的文件中读取命令ENV。 因此,用户应该将仅在登录时执行的.profile 命令放在文件中,并将为每个交互式 shell 执行的命令放在ENV文件中。 要将ENV变量设置为某个文件,请将以下行放在您.profile的主目录中 ENV=$HOME/.shinit; export ENV 替换.shinit您想要的任何文件名。 当从其他 shell 或进程调用sh或dash创建交互式非登录 shell 会话时,只需确保将ENV其设置为适当的 shell 初始化文件。这可以使用任何 Bourne 类型的 shell 来完成 ENV="$HOME/.shinit" sh 或者 ENV="$HOME/.shinit" dash Daniel Doherty 2022-08-30T03:08:13+08:002022-08-30T03:08:13+08:00 关于这些命令的另一件事:它们都调用 /bin/sh(通常是类 unix 系统上的破折号 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 等。
dash
shell(sh
如果由 实现)在作为登录 shell 启动时dash
读取。/etc/profile
然后它读取~/.profile
。该~/.profile
文件可以设置和导出ENV
环境变量。此变量应保存由非登录 shell 提供的文件的路径。这通常是逐个用户完成的,而不是在/etc
.从
dash
手册(我的重点):当从其他 shell 或进程调用
sh
或dash
创建交互式非登录 shell 会话时,只需确保将ENV
其设置为适当的 shell 初始化文件。这可以使用任何 Bourne 类型的 shell 来完成或者
关于这些命令的另一件事:它们都调用 /bin/sh(通常是类 unix 系统上的破折号 shell),但它们将其作为登录 shell 调用,而不是交互式 shell。所以 ENV 指向的文件不会被执行,只有硬连线的 /etc/profile 和 ~/.profile。
为了读取 ENV,您似乎必须将“sh -i -c”放在 shell 命令前面并引用 -c 后面的命令。
然后您会遭受让登录 shell 调用交互式 shell 的效率非常低的问题,但 ENV 将不再被忽略。如果您更喜欢 bash,这也允许您更改 sh->bash 或 ksh 或 zsh 或 fish 等。