我需要一个脚本,这是对/bin/sh启动运行,类似于/bin/bash的.bashrc。有什么办法可以做到这一点吗?
/bin/sh
/bin/bash
.bashrc
编辑:
我尝试了/etc/profile和~/.profile,我将echo 'hello world'写入了两个文件。这些都不管用当我在控制台中键入sh时,没有任何东西弹出。我用的是ArchLinux。
/etc/profile
~/.profile
echo 'hello world'
sh
oyxsuwqo1#
在Arch中,/bin/sh是/bin/bash的符号链接,它有很多关于启动脚本的规则,在调用sh时有一些特殊情况:如果使用名称sh调用bash,它会尝试尽可能接近地模仿sh的历史版本的启动行为,…如果您从控制台启动它,而没有任何命令,即作为交互式的非登录shell,您应该使用ENV变量:
ENV
export ENV=~/.profile sh
字符串或者是
ENV=~/.profile sh
型当作为一个名为sh的交互式[非登录] shell调用时,bash会查找变量ENV,如果定义了它,则扩展它的值,并使用扩展后的值作为要读取和执行的文件名。或者,您可以使用--login选项使其表现得像登录shell,并读取.profile文件。
--login
.profile
sh --login
型当作为交互式登录shell [名称为sh]**或带有--login选项的非交互式shell调用时,它首先尝试按顺序从/etc/profile和~/.profile读取和执行命令
km0tfn4u2#
我将假设,就像在debian-ubuntu-like系统上一样,您的/bin/sh是dash。对于dash,将环境变量ENV设置为您选择的初始化文件的路径。这将是dash对~/.bashrc的模拟。如果您对登录shell感兴趣,dash读取~/.profile。例如,可以向~/.profile添加:
dash
~/.bashrc
ENV=$HOME/.shinit; export ENV
字符串这将导致dash在交互式shell启动时读取~/.shinit。
~/.shinit
“我尝试了/etc/profile和~/.profile,我在两个文件中都写了echo 'hello world'。这些都不管用当我在控制台中键入sh时,什么也没有弹出。”这些文件 * 仅 * 用于 login shell读取。如果您只是在命令提示符下运行sh,那么您正在启动一个 interactive shell。
从man dash:
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中
型替换为“.shinit”任何你想要的文件名。如果除了选项之外还指定了命令行参数,则shell将第一个参数视为要从中读取命令的文件的名称(shell脚本),其余参数设置为shell的位置参数($1,$2等)。否则,shell从其标准输入读取命令。[强调部分已添加。]
从POSIX standard(提示:chepner):
当且仅当调用交互式shell时,该变量应通过shell进行参数扩展(参见参数扩展),并且结果值应用作包含要在当前环境中执行的shell命令的文件的路径名。文件不需要是可执行的。如果ENV的扩展值不是绝对路径名,则结果未指定。如果进程的真实的有效的用户ID或真实有效的组ID不同,则忽略ENV。
zed5wv103#
一个快速(可能不安全)的黑客,利用ENV功能在docker文件中自定义rc,以便能够执行类似docker run -it ${image} sh的东西:
docker run -it ${image} sh
ENV ENV /etc/env.sh RUN echo "alias ll='ls -la'" >> "${ENV}"
字符串(可能不安全,因为用户可以在容器运行时覆盖ENV值)
3条答案
按热度按时间oyxsuwqo1#
在Arch中,
/bin/sh
是/bin/bash
的符号链接,它有很多关于启动脚本的规则,在调用sh
时有一些特殊情况:如果使用名称sh调用bash,它会尝试尽可能接近地模仿sh的历史版本的启动行为,…
如果您从控制台启动它,而没有任何命令,即作为交互式的非登录shell,您应该使用
ENV
变量:字符串
或者是
型
当作为一个名为sh的交互式[非登录] shell调用时,bash会查找变量ENV,如果定义了它,则扩展它的值,并使用扩展后的值作为要读取和执行的文件名。
或者,您可以使用
--login
选项使其表现得像登录shell,并读取.profile
文件。型
当作为交互式登录shell [名称为sh]**或带有--login选项的非交互式shell调用时,它首先尝试按顺序从/etc/profile和~/.profile读取和执行命令
km0tfn4u2#
我将假设,就像在debian-ubuntu-like系统上一样,您的
/bin/sh
是dash
。对于dash,将环境变量
ENV
设置为您选择的初始化文件的路径。这将是dash对~/.bashrc
的模拟。如果您对登录shell感兴趣,
dash
读取~/.profile
。例如,可以向
~/.profile
添加:字符串
这将导致
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中
型
替换为“.shinit”任何你想要的文件名。
如果除了选项之外还指定了命令行参数,则shell将第一个参数视为要从中读取命令的文件的名称(shell脚本),其余参数设置为shell的位置参数($1,$2等)。否则,shell从其标准输入读取命令。[强调部分已添加。]
POSIX
从POSIX standard(提示:chepner):
ENV
当且仅当调用交互式shell时,该变量应通过shell进行参数扩展(参见参数扩展),并且结果值应用作包含要在当前环境中执行的shell命令的文件的路径名。文件不需要是可执行的。如果ENV的扩展值不是绝对路径名,则结果未指定。如果进程的真实的有效的用户ID或真实有效的组ID不同,则忽略ENV。
zed5wv103#
一个快速(可能不安全)的黑客,利用ENV功能在docker文件中自定义rc,以便能够执行类似
docker run -it ${image} sh
的东西:字符串
(可能不安全,因为用户可以在容器运行时覆盖ENV值)