我需要一个在/bin/sh启动时运行的脚本,类似于.bashrc for /bin/bash。有办法这样做吗?
编辑:
我尝试了/etc/profile和~/.profile,并将echo 'hello world'写到了两个文件中。这些都不起作用。当我在控制台中输入sh时,什么都不会弹出。
我正在使用ArchLinux。
发布于 2016-09-21 17:08:15
在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当调用作为名称为sh的交互式登录shell时,或者调用带有-选项的非交互式shell时,它首先尝试按该顺序读取和执行来自/etc/和~/.的命令。
发布于 2016-09-21 16:32:40
我将假设,就像在类似debian的系统上一样,您的/bin/sh是dash。
对于破折号,将环境变量ENV设置为具有您选择的初始化文件的路径。这将是达什的模拟~/.bashrc。
如果您对登录shell感兴趣,dash会读取~/.profile。
例如,可以在~/.profile中添加
ENV=$HOME/.shinit; export ENV这将导致dash在交互式shell启动时读取~/.shinit。
编辑
“我尝试了/etc/profile和~/.profile,在这两个文件中都写了echo 'hello world‘。这些文件都没有工作。当我在控制台中输入sh时,什么都不会弹出。”
这些文件只为登录shell读取。如果您只是在命令提示符下运行sh,那么您将启动一个交互式shell。
文档
来自man dash
调用 如果不存在are,如果shell的标准输入连接到终端(或者设置了-i标志),并且不存在-c选项,则shell被视为交互式shell。交互式shell通常在每个命令之前提示,并以不同的方式处理编程和命令错误(如下所述)。当第一次启动时,shell检查参数0,如果以破折号“-”开头,则shell也被视为登录shell。这通常由系统在用户第一次登录时自动完成。登录shell首先从文件/etc/profile和.profile (如果存在的话)读取命令。如果环境变量ENV是在进入交互式shell时设置的,或者是在登录shell的.profile中设置的,则shell接下来将从ENV中命名的文件中读取命令。因此,用户应该在文件中放置仅在登录时才执行的命令,以及对ENV文件中的每个交互shell执行的命令。要将ENV变量设置为某个文件,请将以下行放在主目录的.profile中 ENV =$HOME/..shinit;出口ENV 替代“.shinit”任何您想要的文件名。 如果指定了选项之外的命令行参数,则shell将第一个参数视为读取命令的文件名( shell脚本),其余参数设置为shell的位置参数($1、$2等)。否则,shell从其标准输入中读取命令。重点补充。
POSIX
来自POSIX标准 (帽子提示:切普纳):
ENV 此变量仅在调用交互式shell时由shell进行参数扩展(请参阅参数扩展),其结果值将用作包含在当前环境中执行的shell命令的文件的路径名。该文件不需要可执行。如果ENV的展开值不是绝对路径名,则结果不指定。如果进程的实际有效用户ID或实际有效组ID不同,则应忽略ENV。
https://stackoverflow.com/questions/39621880
复制相似问题