- 概述
- shell 的执行方式
- 背景
- 偶尔执行个 shell 脚本
- 一般都用 ./ 执行
- 最近忽然看到 有不同的执行方式, 感觉有必要整理一下, 然后和大家分享
- 偶尔执行个 shell 脚本
- 准备
- os
- centos7
- shell
- bash
- os
1. shell 脚本的普通执行
- shell 脚本执行
- 最常用的执行方式
> cd <path/to/scriptDir> > ./<script> [option and args]
- 最常用的执行方式
- 其实 shell 脚本, 还有 其他的 执行方式
2. 其他的执行方式
- 普通方式
> cd <path/to/scriptDir> > ./<script> [option and args]
- source
# 纳尼? source 也是用来执行脚本的? > cd <path/to/scriptDir> > source <script> [option and args]
- 普通加 &
> cd <path/to/scriptDir> > ./<script> [option and args]
3. 场景: 设置环境变量
- 一般的变量
- 只能在 当前 shell 里生效
- 其他 shell 里无法生效
- 只能在 当前 shell 里生效
- 环境变量
- 可以在 当前 shell 和 子 shell 里生效
- 设置环境变量
- 命令
# 方法1: 设置变量后, 直接 export > foo=bar > export foo # 方法2: 在 ~/.bash_profile 或者 /etc/profile 里添加, 然后 source 配置文件
- 方法2 的疑问
- 疑问1: source 不是执行 shell 脚本的吗?
- 解答
- 没错, 这些配置文件, 本质上就是 shell 脚本
- 解答
- 疑问2: 为啥要用 source, 直接 ./不行吗?
- 卧槽, 可以试试啊...
- 疑问1: source 不是执行 shell 脚本的吗?
- 命令
4. 实验: 配置 环境变量
- 场景
- 配置环境变量
- 脚本
#!/bin/bash # demo.sh foo=bar export foo
- 脚本
- 验证变量是否生效
- 命令
> env | grep foo
- 命令
- 配置环境变量
1. 方案1: source
- 命令
> source demo.sh
- 结果
- 没有问题
2. 方案2: ./
- 命令
> ./demo.sh
- 结果
- 发现检测不到 foo 的值
3. 方案3; ./ &
- 命令
> ./demo.sh &
- 结果
- 发现检测不到 foo 的值
4. 疑问: 为啥只有 方法1 可以呢?
4. 再次尝试: 是不是环境变量没有设置上啊
- 疑问
- 方法2 真的设置好变量了吗
- 脚本
#!/bin/bash foo=bar export foo env | grep foo
- 结果
- 脚本正常运行
- 运行完成
- 显示了 foo=bar
- 然后, 我再次尝试寻找环境变量
- 还是没有
> env | grep foo
- 还是没有
- 脚本正常运行
- 疑问
- 这次确实设置上来, 为啥还是没有呢?
5. 环境变量
- 一般变量
- 作用域
- 只能在当前 shell 中使用
- 其他 shell 都不行
- 作用域
- 环境变量
- 作用域
- 当前 shell 和 子shell
- 回想一下
- 在 当前shell 配置了环境变量, 你重新开一个 ssh 是不是用不了这个变量?
- 作用域
- 用户变量
- 作用域
- 以 特定用户身份 登录的所有 shell
- 配置
- 用户目录的 .bash_profile 文件
- 好像 .bashrc 也有
- 废话, bashrc 会被 bash_profile 执行
- 好像 .bashrc 也有
- 用户目录的 .bash_profile 文件
- 机制
- 以 用户身份启动 shell 前, 会执行这个脚本
- 作用域
- 初始变量
- 作用域
- 所有 shell
- 配置
- /etc/bash_profile
- 机制
- 启动 shell 前, 会执行这个脚本
- 作用域
- 疑问
- 既然环境变量是 当前 shell 和 子 shell
- 那会不会是 shell 的关系?
6. shell 执行
- 执行方式
source <script>
./<script>
./<scirpt> &
- 区别
- 他们最主要区别, 是 shell 的区别
1. source <script>
- shell
- 使用 当前shell 执行
- 当前 shell 的 stdin, stdout, stderr 占用 console
- 使用 当前shell 执行
2. ./<script>
- shell
- 使用 当前shell 的 子shell 执行
- 当前 shell 直接挂机
- 子shell 接管 console
- stdin, stdout, stderr
bash <script>
跟这个一样, 就不单独列出来了
- 使用 当前shell 的 子shell 执行
3. ./<scirpt> &
- shell
- 使用 当前shell 的 子shell 执行
- 当前 shell 继续占用 console
- 子 shell 在后台执行
- 会返回一个 job 的编号
- 使用 当前shell 的 子shell 执行
7. 结合之前的环境变量, 大概可以做出如下的推理
- source 方法生效
- source 给当前 shell 配置了 环境变量
- 配置成功了后, 直接找到, 没有问题
./<script>
不生效- 用 script 执行命令后, 会首先生成 子shell
- 命令在 子shell 中, 配置了一个 环境变量
- 执行结束, 控制权返回 父shell
- 可是环境变量在 父shell 里不生效
./<script> &
不生效- 情况同上面的 类似
ps
- ref
- 学习 bash
- Linux - Shell - 变量简介
- &
- 这玩意是什么鬼
- 相关的 job 命令, 又是什么鬼
原文地址:https://www.cnblogs.com/xy14/p/12041127.html
时间: 2024-10-10 01:14:03