bash与source等特点和区别

熟悉Linux的朋友常使用·bash·、·sh·、·source·、·.·,但却并非每位朋友都知道其中的区别

1、source命令用法:

source FileName

作用:

当前bash环境下读取并执行FileName中的命令。该filename文件可以无执行权限

注:该命令通常用命令“.”来替代。

如:source .bash_profile
   . .bash_profile两者等效。
source(或点)命令通常用于重新执行刚修改的初始化文档。
source命令(从 C Shell 而来)是bash shell的内置命令。
点命令,就是个点符号,(从Bourne Shell而来)。

2、sh和bash命令用法:

sh FileName   bash FileName

作用:

打开新的子shell,读取并执行FileName中的命令。该filename文件可以无“执行权限”
 注:两者在执行文件时的不同,是分别用自己的shell来跑文件。

sh使用“-n”选项进行shell脚本的语法检查,使用“-x”选项实现shell脚本逐条语句的跟踪,
可以巧妙地利用shell的内置变量增强“-x”选项的输出信息等。

3、./的命令用法:

./FileName

作用:

打开一个子shell来读取并执行FileName中命令。

注:运行一个shell脚本时会启动另一个命令解释器.

每个shell脚本有效地运行在父shell(parent shell)的一个子进程里. 这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.shell脚本也可以启动他自已的子进程. 这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务.

常用的shell的嵌入命令(内部命令)有如下这些,

: 空,永远返回为true
.   从当前shell中执行操作
break 退出for、while、until或case语句
cd 改变到当前目录
continue 执行循环的下一步
echo 反馈信息到标准输出
eval 读取参数,执行结果命令
exec 执行命令,但不在当前shell
exit 退出当前shell
export 导出变量,使当前shell可利用它
pwd 显示当前目录
read 从标准输入读取一行文本
readonly 使变量只读
return 退出函数并带有返回值
set 控制各种参数到标准输出的显示
shift 命令行参数向左偏移一个
test 评估条件表达式
times 显示shell运行过程的用户和系统时间
trap 当捕获信号时运行指定命令
ulimit 显示或设置shell资源
umask 显示或设置缺省文件创建模式
unset 从shell内存中删除变量或函数
wait 等待直到子进程运行完毕
直接执行enable命令也可以得到所有的内部命令列表。


 

<think>嗯,用户再次询问关于Linux系统的bashrcbash_profile文件区别,这已经是同类问题的第三次追问了。看来用户确实需要彻底掌握这个知识点,可能是系统管理员或开发人员正在配置服务器环境。 从引用资料来看,用户提供了四个详尽的参考资料,内容非常完整。我需要把这些技术文档提炼成更易懂的对比,尤其要注意区分“登录shell”“非登录shell”这个核心概念。用户前两次提问时已经表现出对基础概念的理解,这次应该需要更深入的实践指导。 注意到引用[3]提到的那种常见做法——在bash_profile里source bashrc,这个实战技巧必须重点说明。很多用户混淆这两个文件就是因为实际环境中常看到这种混合配置。还要解释清楚/etc/profile~/.profile这些全局文件的关系,避免用户被多层配置搞糊涂。 用户似乎更关注bashrc的日常使用场景,比如引用[2]提到的“在shell中再键入bash命令”这种具体案例。我应该多举些实例说明何时修改哪个文件,比如配置PATH变量应该放在哪里,alias又该放在哪里。最后那个“无法保存环境变量”的典型问题案例加得很好,这种故障排查经验正是用户需要的。 这次回复结构可以优化:先一句话概括本质区别,再用对比表格突出关键差异,然后说明实际配置中的关联性,最后补充常见错误案例。表格要包含执行顺序、典型用途、修改后生效方式这些实用信息。避免直接引用技术术语堆砌,比如“交互式非登录shell”这种说法要转化成“当你打开新终端窗口时会读取哪个文件”这样的日常描述。 </think>在Linux系统中,`.bashrc``.bash_profile`都是用于配置Bash Shell环境的文件,但二者的**触发场景****作用范围**有本质区别: --- ### **核心区别总结** | **文件** | **触发条件** | **典型应用场景** | **生效范围** | |-------------------|-----------------------------|--------------------------------|--------------------| | `.bash_profile` | **登录Shell**(Login Shell) | SSH远程登录、系统启动时的tty登录 | **仅当前用户** | | `.bashrc` | **非登录Shell**(Non-Login Shell) | 图形界面打开终端、子Shell启动 | **仅当前用户** | > 📌 **关键概念** > - **登录Shell**:需要认证的完整会话(如SSH登录、tty控制台登录) > - **非登录Shell**:无需认证的派生会话(如GNOME终端、执行`bash`命令新建子Shell) --- ### **详细解析** #### 1. **`.bash_profile`** - **触发时机**:用户通过登录Shell进入系统时**仅执行一次** - **典型用途**: - 设置环境变量(`PATH`, `JAVA_HOME`等) - 启动关键服务或脚本 - **优先级**:若不存在,系统会尝试读取`~/.bash_login`或`~/.profile`[^4] - **局限**:在图形界面打开的终端中**不会执行** #### 2. **`.bashrc`** - **触发时机**: - 每次打开**非登录Shell**(如桌面环境的终端) - 启动**子Shell**(在Shell中执行`bash`命令时)[^2] - **典型用途**: - 定义命令别名(`alias ll='ls -al'`) - 设置Shell提示符(`PS1`) - 加载函数局部变量 - **特点**:**多次执行**(每开一个新终端窗口就执行一次) --- ### **二者的协作关系** 实践中常通过`.bash_profile`主动加载`.bashrc`实现配置统一: ```bash # ~/.bash_profile 中的典型配置 if [ -f ~/.bashrc ]; then source ~/.bashrc # 显式加载.bashrc fi ``` 这样**登录Shell**既能获得环境变量,又能继承别名等配置[^3]。 --- ### **配置加载顺序** 系统级配置 → 用户级配置的完整流程: 1. 先加载全局配置 `/etc/profile` 2. 再加载用户级配置(按优先级尝试): `~/.bash_profile` → `~/.bash_login` → `~/.profile` 3. 若在`.bash_profile`中主动调用,则加载`~/.bashrc`[^4] --- ### **常见问题示例** ❌ **问题**:在`.bashrc`中设置了`PATH`,但SSH登录后不生效 ✅ **原因**:SSH属于登录Shell,应修改`.bash_profile`或通过`source ~/.bashrc`联动 ❌ **问题**:桌面终端中别名有效,但`java`命令找不到 ✅ **原因**:环境变量应放在`.bash_profile`中,别名放`.bashrc` > 💡 **最佳实践**: > - **环境变量** → 存入 `.bash_profile` > - **别名/函数** → 存入 `.bashrc` > - 通过 `source ~/.bashrc` 实现配置继承[^3] --- ### **快速决策指南** | **你需要** | **修改的文件** | |---------------------------|--------------------| | 设置SSH登录后的环境变量 | `.bash_profile` | | 自定义终端快捷键/别名 | `.bashrc` | | 让配置对所有终端生效 | 二者联动配置 | [^1]: 登录Shell非登录Shell的行为差异 [^2]: 子Shell对.bashrc的触发机制 [^3]: 配置继承的标准化实践 [^4]: Linux环境变量的加载层次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值