我需要一个在/bin/sh
启动时运行的脚本,类似于.bashrc
的{{1}}。有没有办法做到这一点?
修改
我尝试了/bin/bash
和/etc/profile
,我为这两个文件写了~/.profile
。这些都不起作用。当我在控制台中输入echo 'hello world'
时,不会弹出任何内容。
我正在使用ArchLinux。
答案 0 :(得分:7)
我将假设,就像debian-ubuntu类系统一样,你的/bin/sh
是dash
。
对于dash,将环境变量ENV
设置为具有所选初始化文件的路径。这可能类似于~/.bashrc
。
如果您对登录shell感兴趣,dash
会读取~/.profile
。
例如,可以添加到~/.profile
:
ENV=$HOME/.shinit; export ENV
当交互式shell启动时,这会导致dash
读取~/.shinit
。
"我尝试了/ etc / profile和〜/ .profile,我写了echo' hello world' 两个文件。这些都不起作用。当我输入sh 控制台,没有任何弹出。"
登录 shell只能 读取这些文件。如果您只是在命令提示符下运行sh
,那么您将启动交互式 shell。
来自man dash
:
调用
如果没有args且标准输入为 shell连接到终端(或者如果设置了-i标志),和 -c选项不存在,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 standard(帽子提示:chepner):
ENV
此变量,当且仅当交互式shell为时 调用后,应进行参数扩展(参见参数 由shell扩展),结果值应用作a 包含要在当前执行的shell命令的文件的路径名 环境。该文件无需执行。如果扩大了价值 ENV不是绝对路径名,结果未指定。 ENV 如果真实有效的用户ID或真实的,则应忽略 该过程的有效组ID不同。
答案 1 :(得分:5)
在Arch中,return fragment
是/bin/sh
的符号链接,它有很多关于启动脚本的规则,在调用/bin/bash
时有特殊情况:
如果使用名称sh调用bash,它会尝试模仿启动 sh的历史版本的行为尽可能接近,......
如果从控制台启动它,没有任何命令,即作为交互式非登录shell,则应使用sh
变量:
ENV
或
export ENV=~/.profile
sh
当作为名为sh 的交互式[非登录] shell调用时,bash查找变量ENV,如果已定义则展开其值,并使用扩展值作为名称要读取和执行的文件。
或者,您可以使用ENV=~/.profile sh
选项使其行为类似于登录shell,并阅读--login
文件。
.profile
当调用作为交互式登录shell [名称为sh] 时,或者a 使用--login选项的非交互式shell,它首先尝试 从/ etc / profile和〜/ .profile读取并执行命令 为了