例如有一个脚本文件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. Pychram基本操作

    1. 更改pychram页面为黑色背景主题.更改主题: File ->Settings -> Editor -> Color Scheme -> Scheme -> Mo ...

  2. python简单试题4

    ( ps : 题目中用到的一些random函数在最后末尾处有介绍)  1,在屏幕上显示跑马灯文字 import os # 调用os模块 import time # 调用时间模块 def main(): ...

  3. 虚拟机中配置SQL SERVER2008R2远程访问

    VM虚拟机中配置数据库访问 选择虚拟机设置--硬件--网络适配器,选择桥接模式:直接连接物理网络 不可选用主机模式(与主机共享专用网络) 数据库远程配置,转自:http://jingyan.baidu ...

  4. 百度之星初赛A 今夕何夕

    今夕何夕 今天是2017年8月6日,农历闰六月十五. 小度独自凭栏,望着一轮圆月,发出了"今夕何夕,见此良人"的寂寞感慨. 为了排遣郁结,它决定思考一个数学问题:接下来最近的哪一年 ...

  5. Git-Git基本操作

    先来合个影 马上就要和之前实践遗留的数据告别了,告别之前是不是要留个影呢?在Git里,"留影"用的命令叫做tag,更加专业的术语叫做"里程碑"(打tag,或打标 ...

  6. Kali 中文家目录改英文目录

    中文版Kali装好之后,家目录会中文显示,不便操作 root@kali:~# ls -l drwxr-xr-x root root .0K 7月 : 公共 drwxr-xr-x root root . ...

  7. 3 View - 状态保持 session

    1.状态保持 http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态 客户端与服务器端的一次通信,就是一次会话 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据 存储方式包 ...

  8. 【面试】一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生

    曾经的VIP服务 在网络的初期,网民很少,服务器完全无压力,那时的技术也没有现在先进,通常用一个线程来全程跟踪处理一个请求.因为这样最简单. 其实代码实现大家都知道,就是服务器上有个ServerSoc ...

  9. loj2052 「HNOI2016」矿区

    学习一发平面图的姿势--ref #include <algorithm> #include <iostream> #include <cstdio> #includ ...

  10. 云中Active Directory是如何工作的?

    [TechTarget中国原创] 微软公司1999年在Windows Server 2000中引入Active Directory功能.后期的Windows Server版本中陆续进行改善提升,Win ...