运行Linux程序有三种方法:

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

(2)、直接调用命令解释器执行程序(Linux shell是一种解释型语言)。

(3)、使用source执行文件

第一种:作为可执行程序

其中第三中运行方式和前两种有所不同。下面我们来看一个程序小栗子,文件名:echo.sh

#! /bin/sh
cd tmp
echo "hello world"

这是一个完成的,可执行的Linux Shell程序。下面我们来运行这个程序来看看运行结果:

[root@iZ280zyxdy3Z shTest]# pwd                       # 查看当前工作目录
/home/jason/shTest #返回当前工作目录
[root@iZ280zyxdy3Z shTest]# chmod +x echo.sh #将echo.sh文件权限变为可执行
[root@iZ280zyxdy3Z shTest]# ./echo.sh #运行echo.sh文件
hello world #返回的运行结果
[root@iZ280zyxdy3Z shTest]# pwd
/home/jason/shTest #工作目录没有发生改变
[root@iZ280zyxdy3Z shTest]#

从上面的输出你会看到程序运行了。下面我们来看看这个文件的内容吧,首先是第一行#! /bin/sh

当命令行执行程序的时候,首先判断程序是否有可执行权限。如果没有足够的权限,机器会告诉用户:“权限不够”。从安全的角度考虑我们也能够了解到,任何程序在机器上运行,首先应该是判断执行这个程序的用户是否有这个权限。在上面三种运行程序的方式中,我们直接执行文件需要文件具有可执行权限。

其中chmod命令可以修改文件权限,+x参数使可执行文件具有可执行权限。命令行shell接收到我们的执行命令,并且判定我们有可执行权限后,则调用Linux内核命令新建(fork)一个进程。在新建的进程中调用我们的命令。如果这个命令式编译型的(二进制文件),则Linux内核知道怎么去执行文件。可是我们的echo.sh是一个文件文件,而不是二进制文件(编译型的文件)内核并不知道如何运行。内核不知道怎么运行的,但是shell却知道这确实是一个脚本文件,于是shell会启动一个新的shell进程来执行这个程序。由于现在的Linux中用于好几个shell,到底这个程序该选择那个shell呢,这时候#! /bin/sh发挥作用的时候到了,他指定了 shell会创建一个什么样的进程来执行脚本。在本例中我们创建了一个/bin/sh(标准shell)进程来执行脚本。他的执行过程是命令行在扫过第一行,发现#! 之后读取他后面的字符,搜索解释器的完整路径。如果这一行有参数的话也会一起读取。这个程序的运行首先经过第一种判断,如果不是直接可以运行的文件,则会查看是不是第二种运行方式(通过调用命令行解释器),刚好echo.sh文件就是可以通过命令行解释器可以运行。也就是在这三种执行方法中,如果#! 中指定的shell解释器和第二种指定的shell解释器相同的话,这两种的执行结果就是相同的。

如果你不知道具体的解释器的路径,可以通过whereis查询:
$>whereis bash
/bin/bash

2、作为解释器参数

这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

[root@localhost test]# /bin/sh test1.sh
test11 for shell!!!

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

3、使用source执行文件

下面来看看通过第三种方式来执行程序:

[root@iZ280zyxdy3Z shTest]# pwd                   #查看当前工作目录
/home/jason/shTest
[root@iZ280zyxdy3Z shTest]# source echo.sh #运行echo.sh文件
hello world
[root@iZ280zyxdy3Z tmp]# pwd
/tmp #工作目录改变了
[root@iZ280zyxdy3Z tmp]#

工作目录怎么改变了呢??下面我们来看下是什么原因:

在解决上面问题之前,先让我们来看看shell的命令种类:

Linux Shell可执行的命令有三种:内建命令,shell函数和外部命令

(1))、内建命令就是shell程序本身包含的命令。这些命令集成在shell解释器里面,例如几乎所有的shell命令解释器中都包含cd内建命令来改变工作目录。部分内建命令的存在是为了改变shell本身的属性设置,在执行内建命令的时候没有进程的创建与消亡。另一部分常见的内建命令就是常用的I/O命令,例如:echo

(2)、Shell函数是一系列程序代码,是shell语言写成。它可以像以他命令一样被引用。

(3)、外部命令是独立于shell的可执行程序。例如find,grep,echo.sh。命令行shell在执行外部命令的时候,会创建一个当前shell的复制进程来执行。在执行过程中存在进程的创建与消亡。

外部命令的执行过程如下:

参考如下:http://www.cnblogs.com/stephen-liu74/archive/2011/12/20/2285454.html

shell编程入门(一)的更多相关文章

  1. Linux Shell编程入门

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  2. 转:Linux Shell编程入门

    http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html 从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来 ...

  3. 转inux Shell编程入门

    http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html 从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来 ...

  4. Linux下的shell编程入门

    通常情况下,我们从命令行输入命令每输入一次就能够得到系统的一次响应.一旦需要我们一个接着一个的输入命令而最后才得到结果的时候,这样的做法显然就没有效率.要达到这样的目的,通常我们利用shell程序或者 ...

  5. Shell编程入门基础上

    前言 为什么学 Shell Shell 脚本语言是实现 Linux/UNIX 系统管理及自动化运维所必备的重要工具, Linux/UNIX 系统的底层及基础应用软件的核心大都涉及 Shell 脚本的内 ...

  6. [转]Linux Shell编程入门

    转自:http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html 从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的 ...

  7. SHELL编程入门简介

    一.SHELL软件概念和应用场景 1) 学习Linux技术,不是为了学习系统安装.命令操作.用户权限.配置IP.网络管理,学习Linux技术重点:基于Linux系统部署和维护各种应用软件.程序(Apa ...

  8. shell编程入门

    背景知识 Shell 是用户与内核进行交互操作的一种接口,是 Linux 最重要的软件之一.目前最流行的 Shell 称为 bash Shell,bash Shell 脚本编程以其简洁.高效而著称,多 ...

  9. Linux简介及常用命令使用5--linux shell编程入门

    生成 测试数据的shell脚本 Vim data_create.sh rm -rf ./data.txttouch data.txtfor((i=0;i<2000;i++))dostr=',na ...

  10. Shell编程入门(再版)(在)

    简单的演示样本Shell规划 演示样例1. #!/bin/bash #This is to show what a shell script looks like echo "Our fir ...

随机推荐

  1. ajax 与springmvc交互返回数据

    1.controller将数据封装成json格式返回页面 @RequestMapping("/dataList") public void datalist(CsoftCunsto ...

  2. poj - 1191 - 棋盘切割(dp)

    题意:将一个8*8的棋盘(每一个单元正方形有个分值)沿直线(竖或横)割掉一块,留下一块,对留下的这块继续这样操作,总共进行n - 1次,得到n块(1 < n < 15)矩形,每一个矩形的分 ...

  3. js跨域解决方式

    什么是跨域? 概念:仅仅要协议.域名.port有不论什么一个不同,都被当作是不同的域.(所谓同源是指,域名.协议,port同样.),对于port和协议的不同,仅仅能通过后台来解决. URL 说明 是否 ...

  4. Python使用SSL方式发送QQ邮箱

    #coding:utf-8 import smtplib from email.mime.text import MIMEText from email.header import Header # ...

  5. 规避javascript多人开发函数重名问题

    命名空间 封闭空间 js模块化mvc(数据层.表现层.控制层) seajs 变量转换成对象的属性 对象化

  6. Linux文件的软链接和硬链接

    1.Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link).还有一种被称为符号链接(Symbolic Link).默认情况下.ln命令产生硬链接. 1.1索引节点 索引节点是 ...

  7. Flash:彻底理解crossdomain.xml、跨swf调用。

    安全域.crossdomain.xml,到处都有各种各种零碎的基础解释,所以这里不再复述这些概念. 本文目的是整理一下各种跨域加载的情况.什么时候会加载crossdomain,什么时候不加载.   1 ...

  8. 〖Linux〗tmux 配置文件

    tmux中默认的shell是zsh,zsh在日常中使用可以协助我们高效地使用shell命令. 配置文件默认位置 ~/.tmux.conf,此外,把常用快捷键也附录在这里,方便记忆. # 设置Shell ...

  9. Android插件化开发之解决OpenAtlas组件在宿主的注冊问题

    OpenAtlas有一个问题,就是四大组件必须在Manifest文件里进行注冊,那么就必定带来一个问题,插件中的组件都要反复在宿主中注冊.像Service,ContentProvider等组件眼下没有 ...

  10. python之函数用法isupper()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法isupper() #http://www.runoob.com/python/att ...