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

  #!/bin/bash
#This is a sample test. cd /tmp
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目录中。

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

linux程序运行浅析的更多相关文章

  1. [转载] linux 程序运行过程中替换文件

    今天被朋友问及“Linux下可以替换运行中的程序么?”,以前依稀记得Linux下是可以的(而Windows就不让),于是随口答道“OK”.结果朋友发来一个执行结果:(test正在运行中)# cp te ...

  2. linux 程序运行监控

    一 . 使用supervise 是daemon-tools 的一个功能,系统的守护进程.在进程挂掉的时候可以自动重启. 二   安装 wget http://cr.yp.to/daemontools/ ...

  3. 如何实现在Windows上运行Linux程序,附示例代码

    微软在去年发布了Bash On Windows, 这项技术允许在Windows上运行Linux程序, 我相信已经有很多文章解释过Bash On Windows的原理, 而今天的这篇文章将会讲解如何自己 ...

  4. 使程序在Linux下后台运行,程序运行前后台切换

    一.为什么要使程序在后台执行 我们计算的程序都是周期很长的,通常要几个小时甚至一个星期.我们用的环境是用putty远程连接到日本Linux服务器.所以使程序在后台跑有以下三个好处: 1:我们这边是否关 ...

  5. 不装mono,你的.NET程序照样可以在Linux上运行!

    让.NET应用程序在linux上运行,目前通用的做法就是在Linux上安装mono,然后通过”mono your.exe“命令运行这个程序. 这种运行.net程序的办法有两个弱点,一个是需要客户机安装 ...

  6. 在Linux中运行Nancy应用程序

    最近在研究如何将.NET应用程序移植到非Windows操作系统中运行,逐渐会写一些文章出来.目前还没有太深的研究,所以这些文章大多主要是记录我的一些实验. 这篇文章记录了我如何利用NancyFx编写一 ...

  7. linux下实现在程序运行时的函数替换(热补丁)

    声明:以下的代码成果,是参考了网上的injso技术,在本文的最后会给出地址,同时非常感谢injso技术原作者的分享. 但是injso文章中的代码存在一些问题,所以后面出现的代码是经过作者修改和检测的. ...

  8. Linux后台运行程序

    Linux后台运行程序 最近写的程序需要部署到Linux服务器上,按照以前的方式,在运行后面增加&,程序会切换为后台运行.但因为Linux一般是通过ssh远程登录的,等到退出当前session ...

  9. linux(ubuntu) 搭建java程序运行环境

    一:简介 ubuntu 系统的和linux差不多,我们需要在系统上搭建java程序运行环境,需要安装jdk,mysql这两个软件,tomcat是绿色版,直接通过taz -zxvf tomcat 就可以 ...

随机推荐

  1. ZendFramework-2.4 源代码 - 开始

    ZendFramework 是一种PHP框架. 写在前面 最早遇到ZendFramework是在阅读一款叫Magento电子商务系统源代码时看到,后来因为工作,把注意力侧重在其他方面,就搁置了继续了解 ...

  2. cut(树形DP)

    Description F大爷热爱切树.今天他找到一棵黑白树,不到两秒钟,F大爷就把这棵树切掉了.已知原先树上共n个点,每个点都是黑点或者白点,F大爷切去若干条边后,分成的若干个连通子树中每块恰有一个 ...

  3. spark测试几个hadoop的典型例子

    1.求每年的最高温度数据格式如下: 0067011990999991950051507004888888889999999N9+00001+999999999999999999999900670119 ...

  4. 4 Template层-CSRF

    1.csrf 全称Cross Site Request Forgery,跨站请求伪造 某些恶意网站上包含链接.表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站 ...

  5. 关于RelativeLayout设置垂直居中对齐不起作用的问题

    直接上代码 1.原有代码:(红色字体部分不起作用,无法让RelativeLayout中的textview居中) <RelativeLayout Android:id="@+id/aut ...

  6. DevOps实施的三种IT障碍

    [TechTarget中国原创] 现今DevOps可谓是红遍半边天,但正因为它是新的东西,企业也在不停的犯同样的错误.从这些挑战中学习,让你的DevOps项目取得成功. DevOps正在以一种更有效的 ...

  7. 配置网络策略中的 NAP 条件

    TechNet 库 Windows Server Windows Server 2008 R2 und Windows Server 2008 按类别提供的 Windows Server 内容 Win ...

  8. 安装 Windows Server 2012 Active Directory 只读域控制器 (RODC)(级别 200)

    安装 Windows Server 2012 Active Directory 只读域控制器 (RODC)(级别 200) 适用对象:Windows Server 2012 本主题介绍如何创建分步的 ...

  9. Python+Selenium练习篇之13-获取当前页面的URL

    本文介绍如何通过webdriver方法获取当前测试页面的URL.获取当前URL有什么用处呢,一般URL可以帮助我们判断跳转的页面是否正确,或者URL中部分字段可以作为我们自动化测试脚本期待结果的一部分 ...

  10. mojoportal中使用jquey的插件

    以前在mojo中使用jquery的插件,都是把插件的文件内容直接写到了相关的模块中,这样的问题是不整洁,一大串代码. 如果直接在layout.master中引入插件文件,或者在自定义模块中引入插件文件 ...