1. 概述

    1. shell 的执行方式
  2. 背景

    1. 偶尔执行个 shell 脚本

      1. 一般都用 './script' 执行
    2. 最近忽然看到 有不同的执行方式, 感觉有必要整理一下, 然后和大家分享
  3. 准备

    1. os

      1. centos7
    2. shell

      1. bash

1. shell 脚本的普通执行

  1. shell 脚本执行

    1. 最常用的执行方式

      > cd <path/to/scriptDir>
      > ./<script> [option and args]
  2. 其实 shell 脚本, 还有 其他的 执行方式

2. 其他的执行方式

  1. 普通方式

    > cd <path/to/scriptDir>
    > ./<script> [option and args]
  2. source

    # 纳尼? source 也是用来执行脚本的?
    > cd <path/to/scriptDir>
    > source <script> [option and args]
  3. 普通加 &

    > cd <path/to/scriptDir>
    > ./<script> [option and args]

3. 场景: 设置环境变量

  1. 一般的变量

    1. 只能在 当前 shell 里生效

      1. 其他 shell 里无法生效
  2. 环境变量

    1. 可以在 当前 shell 和 子 shell 里生效
  3. 设置环境变量

    1. 命令

      # 方法1: 设置变量后, 直接 export
      > foo=bar
      > export foo
      # 方法2: 在 ~/.bash_profile 或者 /etc/profile 里添加, 然后 source 配置文件
    2. 方法2 的疑问

      1. 疑问1: source 不是执行 shell 脚本的吗?

        1. 解答

          1. 没错, 这些配置文件, 本质上就是 shell 脚本
      2. 疑问2: 为啥要用 source, 直接 ./不行吗?

        1. 卧槽, 可以试试啊...

4. 实验: 配置 环境变量

  1. 场景

    1. 配置环境变量

      1. 脚本

        #!/bin/bash
        # demo.sh
        foo=bar
        export foo
    2. 验证变量是否生效

      1. 命令

        > env | grep foo

1. 方案1: source

  1. 命令

    > source demo.sh
  2. 结果

    1. 没有问题

2. 方案2: ./

  1. 命令

    > ./demo.sh
  2. 结果

    1. 发现检测不到 foo 的值

3. 方案3; ./ &

  1. 命令

    > ./demo.sh &
  2. 结果

    1. 发现检测不到 foo 的值

4. 疑问: 为啥只有 方法1 可以呢?

4. 再次尝试: 是不是环境变量没有设置上啊

  1. 疑问

    1. 方法2 真的设置好变量了吗
  2. 脚本

    #!/bin/bash
    foo=bar
    export foo
    env | grep foo
  3. 结果

    1. 脚本正常运行

      1. 运行完成
      2. 显示了 foo=bar
    2. 然后, 我再次尝试寻找环境变量

      1. 还是没有

        > env | grep foo
  4. 疑问

    1. 这次确实设置上来, 为啥还是没有呢?

5. 环境变量

  1. 一般变量

    1. 作用域

      1. 只能在当前 shell 中使用
      2. 其他 shell 都不行
  2. 环境变量

    1. 作用域

      1. 当前 shell 和 子shell
    2. 回想一下

      1. 在 当前shell 配置了环境变量, 你重新开一个 ssh 是不是用不了这个变量?
  3. 用户变量

    1. 作用域

      1. 以 特定用户身份 登录的所有 shell
    2. 配置

      1. 用户目录的 .bash_profile 文件

        1. 好像 .bashrc 也有

          1. 废话, bashrc 会被 bash_profile 执行
    3. 机制

      1. 以 用户身份启动 shell 前, 会执行这个脚本
  4. 初始变量

    1. 作用域

      1. 所有 shell
    2. 配置

      1. /etc/bash_profile
    3. 机制

      1. 启动 shell 前, 会执行这个脚本
  5. 疑问

    1. 既然环境变量是 当前 shell 和 子 shell
    2. 那会不会是 shell 的关系?

6. shell 执行

  1. 执行方式

    1. source <script>
    2. ./<script>
    3. ./<scirpt> &
  2. 区别

    1. 他们最主要区别, 是 shell 的区别

1. source <script>

  1. shell

    1. 使用 当前shell 执行

      1. 当前 shell 的 stdin, stdout, stderr 占用 console

2. ./<script>

  1. shell

    1. 使用 当前shell 的 子shell 执行

      1. 当前 shell 直接挂机
      2. 子shell 接管 console
        1. stdin, stdout, stderr
    2. bash <script> 跟这个一样, 就不单独列出来了

3. ./<scirpt> &

  1. shell

    1. 使用 当前shell 的 子shell 执行

      1. 当前 shell 继续占用 console
      2. 子 shell 在后台执行
        1. 会返回一个 job 的编号

7. 结合之前的环境变量, 大概可以做出如下的推理

  1. source 方法生效

    1. source 给当前 shell 配置了 环境变量
    2. 配置成功了后, 直接找到, 没有问题
  2. ./<script> 不生效

    1. 用 script 执行命令后, 会首先生成 子shell
    2. 命令在 子shell 中, 配置了一个 环境变量
    3. 执行结束, 控制权返回 父shell
    4. 可是环境变量在 父shell 里不生效
  3. ./<script> & 不生效

    1. 情况同上面的 类似

ps

  1. ref

    1. 学习 bash
    2. Linux - Shell - 变量简介
  2. &

    1. 这玩意是什么鬼
    2. 相关的 job 命令, 又是什么鬼

Linux - Shell - shell 执行方式的更多相关文章

  1. linux shell的执行方式

    ./ ping.sh 这个意思 ,'./'的意思是在当前目录执行, ping.sh----------------------------------------------------------- ...

  2. shell各种执行方式区别

    shell 脚本各种执行方式(source ./*.sh, . ./*.sh, ./*.sh)的区别 原文出处:http://blog.csdn.net/dance_rise/article/deta ...

  3. 『SHELL』--SHELL脚本执行方式(转)

    Shell脚本的执行方式: 注明:wd代表“脚本保存的目录” 1.fork 语法:/wd/shell.sh fork是最普通的, 就是直接在脚本里面用/wd/shell.sh来调用shell.sh这个 ...

  4. shell脚本执行方式

    # BY THE WAY, 其实这块内容算是比较简单的,但是都比较常记得它最基本的两种方式,另外两种却忘记了 1. 利用sh或bash命令执行 sh test.sh bash test.sh 2. 在 ...

  5. shell-1.shell概述、2.shell脚本执行方式

    目录

  6. linux和shell关系

    坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/   索引: 什么是shell shell的分类 shell脚本的执行方式   ...

  7. 【Hadoop离线基础总结】linux的shell编程

    linux的shell编程 基本了解 概述 Shell是一个用C语言编写的程序,通过shell用户可以访问操作系统内核服务,它类似于DOS下的command和后来的cmd.exe.Shell既是一种命 ...

  8. linux,shell脚本set -x的意思

    set -x a=10 命令执行结果: + a=10 echo $a + echo 10 10 set指令能设置所使用shell的执行方式,可依照不同的需求来做设置 -a 标示已修改的变量,以供输出至 ...

  9. Linux 下执行Shell 脚本的方式

    Shell 脚本的执行方式通常有如下三种: (1)bash script-name 或者 sh script-name:(2)path/script-name或者./script-name:(3)so ...

随机推荐

  1. sqli-labs less-17 --> less-20

    Less-17 (报错盲注) 参考资料1:https://www.cnblogs.com/AmoBlogs/p/8673748.html

  2. H5_0014:background-size设置

    2,background-position

  3. JavaScript权威指南第6版

    描述网页内容的html,描述网页样式的css,描述网页行为的JavaScript js,适合面向对象和函数式编程风格 es5新特性 第二章 词法结构 1.JavaScript程序是用Unicode字符 ...

  4. AcWing 11. 背包问题求方案数

    //g[i,j]表示f[i,j]取最大值的方案数目 //体积最多是j 全部为0,v>=0 //体积恰好为j f[0][0]=0,f[i]=无穷,v>=0 //体积至少是j f[0][0]= ...

  5. IP地址分类及其相关计算问题

    IP地址分类及其相关计算问题 公网IP和子网IP 公网IP: • A类:1.0.0.0 到 127.255.255.255 主要分配 给大量主机而局域网网络数量较少的大型网络 • B类:128.0.0 ...

  6. 巴塞尔问题(Basel problem)的多种解法

    巴塞尔问题(Basel problem)的多种解法——怎么计算\frac{1}{1^2}+\frac{1}{2^2}+\frac{1}{3^2}+\cdots112+122+132+⋯ ? (PS:本 ...

  7. 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(5.21.1.10-加-6.4)Atomic_Operations

    5.21.1.10 Write Atomicity Normal 这个特性控制AWUN和NAWUN参数的操作.设置的属性值在set Feature命令的Dword 11中表明. 如果提交Get Fea ...

  8. H3C IP路由基础

    一.路由简介 在网络中路由器根据所收到的报文的目的地址选择一条合适的路径,并将报文转发到下一个路由器.路径中最后一个路由器负责将报文转发给目的主机. 路由就是报文在转发过程中的路径信息,用来指导报文转 ...

  9. C语言 删除排序链表中的重复元素

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2输出: 1->2示例 2: 输入: 1->1->2->3-> ...

  10. python vs java Threadpool

    python 实现threadpool线程池管理: from concurrent.futures import ThreadPoolExecutor as te from concurrent.fu ...