Linux - Shell - shell 执行方式
概述
- shell 的执行方式
背景
- 偶尔执行个 shell 脚本
- 一般都用 './script' 执行
- 最近忽然看到 有不同的执行方式, 感觉有必要整理一下, 然后和大家分享
- 偶尔执行个 shell 脚本
准备
os
- centos7
shell
- bash
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, 直接 ./不行吗?
- 卧槽, 可以试试啊...
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>
跟这个一样, 就不单独列出来了
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 命令, 又是什么鬼
Linux - Shell - shell 执行方式的更多相关文章
- linux shell的执行方式
./ ping.sh 这个意思 ,'./'的意思是在当前目录执行, ping.sh----------------------------------------------------------- ...
- shell各种执行方式区别
shell 脚本各种执行方式(source ./*.sh, . ./*.sh, ./*.sh)的区别 原文出处:http://blog.csdn.net/dance_rise/article/deta ...
- 『SHELL』--SHELL脚本执行方式(转)
Shell脚本的执行方式: 注明:wd代表“脚本保存的目录” 1.fork 语法:/wd/shell.sh fork是最普通的, 就是直接在脚本里面用/wd/shell.sh来调用shell.sh这个 ...
- shell脚本执行方式
# BY THE WAY, 其实这块内容算是比较简单的,但是都比较常记得它最基本的两种方式,另外两种却忘记了 1. 利用sh或bash命令执行 sh test.sh bash test.sh 2. 在 ...
- shell-1.shell概述、2.shell脚本执行方式
目录
- linux和shell关系
坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/ 索引: 什么是shell shell的分类 shell脚本的执行方式 ...
- 【Hadoop离线基础总结】linux的shell编程
linux的shell编程 基本了解 概述 Shell是一个用C语言编写的程序,通过shell用户可以访问操作系统内核服务,它类似于DOS下的command和后来的cmd.exe.Shell既是一种命 ...
- linux,shell脚本set -x的意思
set -x a=10 命令执行结果: + a=10 echo $a + echo 10 10 set指令能设置所使用shell的执行方式,可依照不同的需求来做设置 -a 标示已修改的变量,以供输出至 ...
- Linux 下执行Shell 脚本的方式
Shell 脚本的执行方式通常有如下三种: (1)bash script-name 或者 sh script-name:(2)path/script-name或者./script-name:(3)so ...
随机推荐
- Qt多线程实现思路二
建立一个继承于Qobject的类myThread 在类myThread中定义线程处理函数不必是思路一里的run(); 在窗口类中开辟一个自定义线程myThread的指针对象myT = new myTh ...
- react-native构建基本页面2---轮播图+九宫格
配置首页的轮播图 轮播图官网 运行npm i react-native-swiper --save安装轮播图组件 导入轮播图组件import Swiper from 'react-native-swi ...
- 对主定理(Master Theorem)的理解
前言 虽说在学OI的时候学到了非常多的有递归结构的算法或方法,也很清楚他们的复杂度,但更多时候只是能够大概脑补这些方法为什么是这个复杂度,而从未从定理的角度去严格证明他们.因此借着这个机会把主定理整个 ...
- 我的翻译--GSMem:通过GSM频率从被物理隔离的计算机上窃取数据
抽象概念 AG网络是指在物理上与公共互联网断开的网络.虽然近几年人们验证了入侵这类网络系统的可行性,但是从这种网络上获取数据仍然是一个有挑战的任务.在本文中,我们介绍GSMem,它是一个可以在蜂窝数据 ...
- format的使用
v="敬爱可亲的{0},最喜欢在{1}地方干{2}" name1=input("名字>") lang=input("地点>") ...
- TCP的粘包和拆包问题及解决
前言 TCP属于传输层的协议,传输层除了有TCP协议外还有UDP协议.那么UDP是否会发生粘包或拆包的现象呢?答案是不会.UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit ...
- 使用TensorFlow训练模型的基本流程
本文已在公众号机器视觉与算法建模发布,转载请联系我. 使用TensorFlow的基本流程 本篇文章将介绍使用tensorflow的训练模型的基本流程,包括制作读取TFRecord,训练和保存模型,读取 ...
- bash数学运算之bc
一.expr 1.1 语法 注意必须有空格 只能精确到整数,无法精确到浮点数 1.2 操作符对照表 使用expr命令时需要加\进行转义,因为部分符号是保留关键字 例1:比较num1跟num2的大小 [ ...
- hashlib加密模块_python
一.hashlib模块 1.功能 主要用于字符串加密 2.常用方法 md5()/sha1():创建一个md5或者sha1加密模式的hash对象update(arg):用字符串参数来更新hash对象,如 ...
- Django_RESTful API
https://q1mi.github.io/Django-REST-framework-documentation/ 1. DRF(Django REST framework) 序列化的类 2. 解 ...