/ bin / sh有.bashrc的替代方案吗?

时间:2016-09-21 16:27:37

标签: linux shell sh

我需要一个在/bin/sh启动时运行的脚本,类似于.bashrc的{​​{1}}。有没有办法做到这一点?

修改

我尝试了/bin/bash/etc/profile,我为这两个文件写了~/.profile。这些都不起作用。当我在控制台中输入echo 'hello world'时,不会弹出任何内容。

我正在使用ArchLinux。

2 个答案:

答案 0 :(得分:7)

我将假设,就像debian-ubuntu类系统一样,你的/bin/shdash

对于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

来自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读取并执行命令   为了