首先,咱们从一个十分简单的例子test.sh开始吧:html
#!/bin/sh #this is a test. cd /tmp echo "hello,this is a test"
这是一个十分简单的程序,可是运行结果可能会让你吃惊哦!linux
这个时候,咱们发现程序运行以后,并无改变当前目录。(黑人问号???)shell
别着急,咱们先了解一下linux程序如何运行。bash
linux程序三种执行方法this
运行linux程序有三种方法,分别是:命令行
一、使文件具备可执行权限,直接运行文件。htm
chmod 命令用来修改文件的权限。+x是使文件拥有可执行的权限。就如上面咱们运行程序同样。可是咱们看到的结果与咱们想象当中有必定的出入。进程
二、直接调用命令解释器执行程序。get
以下图所示:io
因为咱们的解释器是/bin/sh,因此,用sh命令解释器来执行程序。
咱们也看到当前的工做路径没有发生变化。(黑人问号???)
三、使用source执行文件。
没错,这里咱们发现当前的工做路径发生了变化,(黑人问号???)可是究竟为何呢?让咱们带着三个黑人问号详细了解一下linux程序究竟怎么执行。
linux程序执行的过程
当命令行shell执行程序时,首先判断是否该程序具备可执行权限。若是没有可执行权限,就会提示:Permission denied(权限不够),以下图所示:
在第一种方法中,咱们直接执行文件,就先加上了可执行权限。
当命令行接收到咱们的执行命令,而且判断具备可执行权限后,则调用Linux内核命令新建一个进程,在新建的进程中调用指定的命令。可是咱们的test.sh不是编译型的文件,因此linux内核不知道如何执行,而后交给shell,shell就知道这是一个脚本,那么就启动一个新的shell进程来进行执行。可是linux系统有不少shell,如图:
咱们程序第一行看到是#!/bin/sh,这时,命令行就启用一个新的bash进程来执行程序。
程序执行差别
在咱们运行shell程序的三种方法中,前两种方法的执行过程以下:
(1)父进程接收到命令,而后发现不是内建命令,因而建立了一个和本身同样的s h e l l进程,来执行这个外部命令
(2)这个s h e l l子进程用/bin/sh取代本身,sh进程设置本身的运行环境变量,其中包括了$PWD变量。
(3)sh进程依次执行内建命令cd和echo。在此过程当中,sh进程(子进程)的环境变量被cd命令改变。
(4)子进程执行完毕,就消亡了,一直在等待的父进程醒来,继续接受命令。
因此咱们明白了前两种方法执行结果跟咱们预期不同的缘由,父进程的当前目录(环境变量)没法被子进程改变。
可是,使用source执行是shell脚本时不会建立子进程,而是在父进程中直接执行。至此黑人问号消失,继续加油写代码吧。
本文地址:http://www.linuxprobe.com/run-linux-program.html