linux 有没有替代/bin/sh的.bashrc的方法?

2q5ifsrm  于 2023-08-03  发布在  Linux
关注(0)|答案(3)|浏览(140)

我需要一个脚本,这是对/bin/sh启动运行,类似于/bin/bash.bashrc。有什么办法可以做到这一点吗?

编辑:

我尝试了/etc/profile~/.profile,我将echo 'hello world'写入了两个文件。这些都不管用当我在控制台中键入sh时,没有任何东西弹出。
我用的是ArchLinux。

oyxsuwqo

oyxsuwqo1#

在Arch中,/bin/sh/bin/bash的符号链接,它有很多关于启动脚本的规则,在调用sh时有一些特殊情况:
如果使用名称sh调用bash,它会尝试尽可能接近地模仿sh的历史版本的启动行为,…
如果您从控制台启动它,而没有任何命令,即作为交互式的非登录shell,您应该使用ENV变量:

export ENV=~/.profile
sh

字符串
或者是

ENV=~/.profile sh


当作为一个名为sh交互式[非登录] shell调用时,bash会查找变量ENV,如果定义了它,则扩展它的值,并使用扩展后的值作为要读取和执行的文件名。
或者,您可以使用--login选项使其表现得像登录shell,并读取.profile文件。

sh --login


当作为交互式登录shell [名称为sh]**或带有--login选项的非交互式shell调用时,它首先尝试按顺序从/etc/profile和~/.profile读取和执行命令

km0tfn4u

km0tfn4u2#

我将假设,就像在debian-ubuntu-like系统上一样,您的/bin/shdash
对于dash,将环境变量ENV设置为您选择的初始化文件的路径。这将是dash对~/.bashrc的模拟。
如果您对登录shell感兴趣,dash读取~/.profile
例如,可以向~/.profile添加:

ENV=$HOME/.shinit; export ENV

字符串
这将导致dash在交互式shell启动时读取~/.shinit

编辑

“我尝试了/etc/profile和~/.profile,我在两个文件中都写了echo 'hello world'。这些都不管用当我在控制台中键入sh时,什么也没有弹出。”
这些文件 * 仅 * 用于 login shell读取。如果您只是在命令提示符下运行sh,那么您正在启动一个 interactive shell。

文档

man dash

调用

如果不存在参数,并且shell的标准输入连接到终端(或者设置了-i标志),并且不存在-c选项,则认为该shell是交互式shell。交互式shell通常在每个命令之前提示,并以不同的方式处理编程和命令错误(如下所述)。第一次启动时,shell检查参数0,如果它以破折号'-'开头,则该shell也被认为是登录shell。这通常在用户首次登录时由系统自动完成。登录shell首先从文件/etc/profile和.profile(如果存在)读取命令。如果环境变量ENV是在进入交互式shell时设置的,或者是在登录shell的.profile中设置的,则shell接下来从ENV中命名的文件中读取命令。**因此,用户应将仅在登录时执行的命令放在.profile文件中,并将为每个交互式shell执行的命令放在ENV文件中。**要将ENV变量设置为某个文件,请将以下行放在主目录的.profile中

ENV=$HOME/.shinit; export ENV


替换为“.shinit”任何你想要的文件名。
如果除了选项之外还指定了命令行参数,则shell将第一个参数视为要从中读取命令的文件的名称(shell脚本),其余参数设置为shell的位置参数($1,$2等)。否则,shell从其标准输入读取命令。[强调部分已添加。]

POSIX

POSIX standard(提示:chepner):

ENV

当且仅当调用交互式shell时,该变量应通过shell进行参数扩展(参见参数扩展),并且结果值应用作包含要在当前环境中执行的shell命令的文件的路径名。文件不需要是可执行的。如果ENV的扩展值不是绝对路径名,则结果未指定。如果进程的真实的有效的用户ID或真实有效的组ID不同,则忽略ENV。

zed5wv10

zed5wv103#

一个快速(可能不安全)的黑客,利用ENV功能在docker文件中自定义rc,以便能够执行类似docker run -it ${image} sh的东西:

  • Dockerfile*
ENV ENV /etc/env.sh
RUN echo "alias ll='ls -la'" >> "${ENV}"

字符串
(可能不安全,因为用户可以在容器运行时覆盖ENV值)

相关问题