Linux - Shell - shell 执行方式

  1. 概述

    1. shell 的执行方式
  2. 背景
    1. 偶尔执行个 shell 脚本

      1. 一般都用 ./ 执行
    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 命令, 又是什么鬼

原文地址:https://www.cnblogs.com/xy14/p/12041127.html

时间: 2024-10-10 01:14:03

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

shell各种执行方式区别

shell 脚本各种执行方式(source ./*.sh, . ./*.sh, ./*.sh)的区别 原文出处:http://blog.csdn.net/dance_rise/article/details/8573560 结论一: ./*.sh的执行方式等价于sh ./*.sh或者bash ./*.sh,此三种执行脚本的方式都是重新启动一个子shell,在子shell中执行此脚本(通过fork实现). 结论二: .source ./*.sh和 . ./*.sh的执行方式是等价的,即两种执行方式

shell脚本执行方式

方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh.如果不加上./,bash可能会响应找到不到hello.sh的错误信息.因为目前的工作目录(/data/shell)可能不在执行程序默认的搜索路径之列,也就是说,不在环境变量PASH的内容之中.查看PATH的内容可用 echo $PASH 命令.现在的/data/shell就不在环境变量PASH中的,所以必须加上

shell 的执行方式

shell执行的方式: Shell脚本的执行通常可以采用以下几种方式 bash /path/to/script-name 或 /bin/bash /path/to/script-name (强烈推荐使用) /path/to/script-name 或 ./script-name (当前路径下执行脚本) source script-name 或 . script-name (注意“.“点号后面有空格) 执行方式说明: 脚本文件本身没有可执行权限或者脚本首行没有命令解释器时使用的方法,我们推荐用ba

linux 进程、执行方式、程序、编程元素

1.进程: shell应用程序的进程一般为交互式的,在广义上分为GUI和CLI GUI(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面,支持鼠标,桌面等外设,比较著名的windows.Android CLI(command-line interface,命令行界面)是指可在用户提示符下键入可执行指令的界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行. CLI的词法一般由 命令,选项,参数组成,分

linux shell执行方式

linux shell执行有两种方式 shell脚本以#!/bin/bash开头,执行shell时先检查首行,在内部以下列方式执行: $/bin/bash script.sh 1. 使用sh执行. $sh script.sh #脚本位于当前目录下 或者 $sh /home/path/script.sh #使用完整路径 2. 独立运行脚本. 需要具备可执行权限,可以通过下面的方式设置 $chmod a+x script.sh 或者 $chmod 755 script.sh 然后可以通过下列方式执行

Linux Shell远程执行命令(命令行与脚本方式)

shell远程执行: 经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了.一下介绍两种shell命令远程执行的方法. 前提条件: 配置ssh免密码登陆 对于简单的命令: 如果是简单执行几个命令,则: ssh [email protected] "cd /home ; ls" 基本能完成常用的对于远程节点的管理了,几个注意的点: 双引号,必须有.如果不加双引号,第二个ls命令在本地执行 分号,两个命令之间用分号隔开 对

shell入门笔记1:执行方式、运行方式、变量、替换、运算符

说明: 本文是关于http://c.biancheng.net/cpp/shell/的相关笔记 shell的两种执行方式 交互式(interactive) 解释执行用户的命令,用户输入一条命令,Shell就解释执行一条. 批处理 (batch) 用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令. 运行shell脚本的两种方法 作为可执行程序 ./test.sh 作为解释器参数 /bin/bash test.sh 注意: 1.

Linux下如何执行Shell脚本

Linux下你可以有两种方式执行Shell脚本: 1.用shell程序执行脚本:根据你的shell脚本的类型,选择shell程序,常用的有sh,bash,tcsh等(一般来说第一行#!/bin/bash里面指明了shell类型的,比如#!/bin/bash指明是bash,#!/bin/sh则是sh):然后输入命令(其中bash为shell的名称,myshell.sh则为你要执行的代码): bash myshell.sh 2.直接执行脚本: 不过首先的加上可执行权限(也许要root权限,4情况而定

[Shell]Shell脚本的执行方式

---------------------------------------------------------------------------------------------------------- 能完成大部分输出任务的命令:echo echo helloworld; #正确 echo "hello world";   #正确 echo "hello world !"; #中间有空格须加引号,且!在Linux中有特殊含义,不能加双引号,而用单引号(注