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目录中。

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

  • 相关阅读:
    移动端IM系统的协议选型:UDP还是TCP?
    【原创】新手入门一篇就够:从零开发移动端IM
    【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南
    【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答
    【原创】轻量级移动端即时通讯技术 MobileIMSDK 发布了
    实时视频直播客户端技术盘点:Native、HTML5、WebRTC、微信小程序
    腾讯技术分享:腾讯是如何大幅降低带宽和网络流量的(图片压缩篇)
    微信团队分享:微信移动端的全文检索多音字问题解决方案
    IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token
    腾讯技术分享:Android版手机QQ的缓存监控与优化实践
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/6834517.html
Copyright © 2011-2022 走看看