linux程序运行浅析
例如有一个脚本文件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程序运行浅析的更多相关文章
- [转载] linux 程序运行过程中替换文件
今天被朋友问及“Linux下可以替换运行中的程序么?”,以前依稀记得Linux下是可以的(而Windows就不让),于是随口答道“OK”.结果朋友发来一个执行结果:(test正在运行中)# cp te ...
- linux 程序运行监控
一 . 使用supervise 是daemon-tools 的一个功能,系统的守护进程.在进程挂掉的时候可以自动重启. 二 安装 wget http://cr.yp.to/daemontools/ ...
- 如何实现在Windows上运行Linux程序,附示例代码
微软在去年发布了Bash On Windows, 这项技术允许在Windows上运行Linux程序, 我相信已经有很多文章解释过Bash On Windows的原理, 而今天的这篇文章将会讲解如何自己 ...
- 使程序在Linux下后台运行,程序运行前后台切换
一.为什么要使程序在后台执行 我们计算的程序都是周期很长的,通常要几个小时甚至一个星期.我们用的环境是用putty远程连接到日本Linux服务器.所以使程序在后台跑有以下三个好处: 1:我们这边是否关 ...
- 不装mono,你的.NET程序照样可以在Linux上运行!
让.NET应用程序在linux上运行,目前通用的做法就是在Linux上安装mono,然后通过”mono your.exe“命令运行这个程序. 这种运行.net程序的办法有两个弱点,一个是需要客户机安装 ...
- 在Linux中运行Nancy应用程序
最近在研究如何将.NET应用程序移植到非Windows操作系统中运行,逐渐会写一些文章出来.目前还没有太深的研究,所以这些文章大多主要是记录我的一些实验. 这篇文章记录了我如何利用NancyFx编写一 ...
- linux下实现在程序运行时的函数替换(热补丁)
声明:以下的代码成果,是参考了网上的injso技术,在本文的最后会给出地址,同时非常感谢injso技术原作者的分享. 但是injso文章中的代码存在一些问题,所以后面出现的代码是经过作者修改和检测的. ...
- Linux后台运行程序
Linux后台运行程序 最近写的程序需要部署到Linux服务器上,按照以前的方式,在运行后面增加&,程序会切换为后台运行.但因为Linux一般是通过ssh远程登录的,等到退出当前session ...
- linux(ubuntu) 搭建java程序运行环境
一:简介 ubuntu 系统的和linux差不多,我们需要在系统上搭建java程序运行环境,需要安装jdk,mysql这两个软件,tomcat是绿色版,直接通过taz -zxvf tomcat 就可以 ...
随机推荐
- V4L2学习(一)整体说明
1.概述 Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口.凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出公共代 ...
- 文件的特殊权限(SUID,SGID,SBIT)
文件的一般权限:r w x 对应 421 文件的特殊权限:SUID SGID SBIT对应 421 文件的隐藏权限:chattr设置隐藏权限,lsattr查看文件的隐藏权限. 文件访问控制列表: ...
- time模块和datetime模块详解
一.time模块 time模块中时间表现的格式主要有三种: a.timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 b.struct_time时间元组,共 ...
- 4 Template层 -定义模板
1.模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一 ...
- TCP/IP网络编程之多播与广播
多播 多播方式的数据传输是基于UDP完成的,因此,与UDP服务端/客户端的实现非常接近.区别在于,UDP数据传输以单一目标进行,而多播数据同时传递到加入(注册)特定组的大量主机.换言之,采用多播方式时 ...
- Python中str、list、numpy分片操作
在Python里,像字符串(str).列表(list).元组(tupple)和这类序列类型都支持切片操作 对对象切片,s是一个字符串,可以通过类似数组索引的方式获取字符串中的字符,同时也可以用s[a: ...
- MySQL安装教程&Navicat安装
一.下载MySQL http://jingyan.baidu.com/article/e3c78d64412ae83c4c85f5fd.html 首先打开MySQL官网,找到Downloads标签,点 ...
- 54、edittext输入类型限制为ip,inputType应该如何设置
<EditText android:id="@+id/et_setting_printer_edit_info_ip" android:layout_width=" ...
- linux环境搭建系列之Apache ant安装步骤
前提: linux centOS6.6 64位操作系统 ROOT账号 JDK1.7 注意:JDK和Ant版本一定要是对应的,因为我的JDK是1.7版本的,所以我在官网下载的ant是1.9的 1.把安装 ...
- Python学习-day14-CSS
前端二:CSS CSS: 一:介绍:学名层叠样式表(Cading Style Sheets)是一种用来表现HTML或者XML等文件的样式的计算机语言.让HTML和XML看起来更加美观. 语法:&l ...