zoukankan      html  css  js  c++  java
  • 如何运行linux shell程序

    原文地址:http://www.sohu.com/a/138822796_610671

    #!/bin/sh

    #this is a test.

    cd /tmp

    echo "hello,this is a test"

    这是一个十分简单的程序,但是运行结果可能会让你吃惊哦!

    这个时候,我们发现程序运行之后,并没有改变当前目录。(黑人问号???)

    别着急,我们先了解一下linux程序如何运行。

    linux程序三种执行方法

    运行linux程序有三种方法,分别是:

    1、使文件具有可执行权限,直接运行文件。

    chmod命令用来修改文件的权限。+x是使文件拥有可执行的权限。就如上面我们运行程序一样。但是我们看到的结果与我们想象当中有一定的出入。

    2、直接调用命令解释器执行程序。

    如下图所示:

    由于我们的解释器是/bin/sh,所以,用sh命令解释器来执行程序。

    我们也看到当前的工作路径没有发生变化。(黑人问号???)

    3、使用source执行文件。

    没错,这里我们发现当前的工作路径发生了变化,(黑人问号???)但是究竟为什么呢?让我们带着三个黑人问号详细了解一下linux程序究竟怎么执行。

    linux程序执行的过程

    当命令行shell执行程序时,首先判断是否该程序具有可执行权限。如果没有可执行权限,就会提示:Permission denied(权限不够),如下图所示:

    在第一种方法中,我们直接执行文件,就先加上了可执行权限。

    当命令行接收到我们的执行命令,并且判断具有可执行权限后,则调用Linux内核命令新建一个进程,在新建的进程中调用指定的命令。但是我们的test.sh不是编译型的文件,所以linux内核不知道如何执行,然后交给shell,shell就知道这是一个脚本,那么就启动一个新的shell进程来进行执行。但是有很多shell,如图:

    我们程序第一行看到是#!/bin/sh,这时,命令行就启用一个新的bash进程来执行程序。

    程序执行差异

    在我们运行shell程序的三种方法中,前两种方法的执行过程如下:

    (1)父进程接收到命令,然后发现不是内建命令,于是创建了一个和自己一样的shell进程,来执行这个外部命令

    (2)这个shell子进程用/bin/sh取代自己,sh进程设置自己的运行环境变量,其中包括了$PWD变量。

    (3)sh进程依次执行内建命令cd和echo。在此过程中,sh进程(子进程)的环境变量被cd命令改变。

    (4)子进程执行完毕,就消亡了,一直在等待的父进程醒来,继续接受命令。

    所以我们明白了前两种方法执行结果跟我们预期不一样的原因,父进程的当前目录(环境变量)无法被子进程改变。

    但是,使用source执行是shell脚本时不会创建子进程,而是在父进程中直接执行。至此黑人问号消失,继续加油写代码吧。

    本文原创地址: 作者:王毅,审核员:逄增宝

    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    中断子系统5_电流层处理
    太极拳透劲的原理推测
    OpenSSL命令---pkcs7
    初步分析美国科研项目申报项目
    OpenSSL命令---pkcs8
    C#中Hashtable的用法
    android 中 ViewPager 的平常用法 ViewPager+ Views
    打卡汇报
    OpenSSL命令---pkcs12
    卡卡游戏引擎之快速入门
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/11300091.html
Copyright © 2011-2022 走看看