zoukankan      html  css  js  c++  java
  • linux程序运行浅析

      例如有一个脚本文件tests.sh,内容如下:  

     1 #!/bin/bash
     2 #This is a sample test.
     3
     4 cd /tmp
     5 echo "Hello, this is a test sample!"

      在Linux上执行脚本程序有三种方法:

      1、将脚本加上可执行权限,直接执行对应的脚本文件

        chmod +x tests.sh

        ./tests.sh

      2、使用shell程序直接解析

        sh tests.sh

      3、使用source命令直接执行脚本命令

        source tests.sh

      但是真正操作之后,就很容易发现,执行的结果,只有第三种方法是完全执行了,而前两种没有切换目录。

      主要是因为,这三种执行文件的方式的思路是不同,区别如下:

      第一种方式:

      1、当命令行 shell 执行程序时,首先判断是否该程序具有可执行权限。如果没有可执行权限,就会提示:Permission denied(权限不够),因此,必须加入加上执行权限的环节;

      2、判断具有可执行权限后,则调用 Linux 内核命令新建一个进程,在新建的进程中调用指定的命令,test.sh 不是编译型的文件,所以 linux 内核并不能知道如何执行文件;

      3、然后交给 shell,shell 就知道这是一个脚本,就会启动一个新的 shell 进程来进行执行。但是 linux 系统有很多 shell,通过代码的第一行#!/bin/bash确定使用bash;

      4、命令行就启用一个新的 bash 进程来执行脚本程序;

      第二种方式:

      1、通过sh命令直接会启动一个新的 shell 进程来进行执行。但是 linux 系统有很多 shell,通过代码的第一行#!/bin/bash确定使用bash;

      2、命令行就启用一个新的 bash 进程来执行脚本程序;

      两种方式的共同点是:  

      1、父进程shell接收到命令,发现不是内建命令,创建了一个和自己一样的 s h e l l 进程,来执行这个外部命令;

      2、此时 s h e l l 子进程用/bin/sh 取代自己,sh子 进程设置自己的运行环境变量,其中包括了$PWD 变量;

      3、sh 子进程依次执行内建命令cd 和echo命令,在这个过程中,sh子进程的环境变量$PWD被改变,子进程执行完毕,就消亡了; 

      4、父进程醒来获取系统资源,恢复自己的环境变量$PWD,继续接受用户输入;

      很自然的就会明白前两种方法执行结果与预期不一样的原因了,由于父进程的当前目录(环境变量$PWD)没有也无法被子进程改变,导致没有切换目录的动作和结果。

      第三种方式:

      1、使用 source 执行 shell 脚本时不会创建子进程;

      2、直接在当前进程中直接执行shell脚本;

      3、直接对环境变量($PWD)予以更改,导致目录修改动作生效,切换到tmp目录中。

      至此,三种执行脚本的方式解析结束,希望对阅读者有所帮助。

  • 相关阅读:
    django xadmin后台集成DjangoUeditor
    vm虚拟机下的ubuntu16.04配置静态ip(NAT方式)
    关于mysql里的concat
    xml转换为数组格式
    关于json的中文转码问题
    判断是否是微信浏览器
    数组和xml的互相转换的封装函数
    关于微信登录的接口开发
    curl的封装类
    php里关于文件下载的方法(两种)
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/6834517.html
Copyright © 2011-2022 走看看