如何运行linux shell程序

原文地址:http://www.sohu.com/a/138822796_610671

首先,我们从一个十分简单的例子test.sh开始吧:

#!/bin/sh

#this is a test.

cd /tmp

echo "hello,this is a test"

这是一个十分简单的程序,但是运行结果可能会让你吃惊哦!

这个时候,我们发现程序运行之后,并没有改变当前目录。(黑人问号???)

别着急,我们先了解一下linux程序如何运行。

linux程序三种执行方法

运行linux程序有三种方法,分别是:

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

chmod命令用来修改文件的权限。+x是使文件拥有可执行的权限。就如上面我们运行程序一样。但是我们看到的结果与我们想象当中有一定的出入。

2、直接调用命令解释器执行程序。

如下图所示:

由于我们的解释器是/bin/sh,所以,用sh命令解释器来执行程序。

我们也看到当前的工作路径没有发生变化。(黑人问号???)

3、使用source执行文件。

没错,这里我们发现当前的工作路径发生了变化,(黑人问号???)但是究竟为什么呢?让我们带着三个黑人问号详细了解一下linux程序究竟怎么执行。

linux程序执行的过程

当命令行shell执行程序时,首先判断是否该程序具有可执行权限。如果没有可执行权限,就会提示:Permission denied(权限不够),如下图所示:

在第一种方法中,我们直接执行文件,就先加上了可执行权限。

当命令行接收到我们的执行命令,并且判断具有可执行权限后,则调用Linux内核命令新建一个进程,在新建的进程中调用指定的命令。但是我们的test.sh不是编译型的文件,所以linux内核不知道如何执行,然后交给shell,shell就知道这是一个脚本,那么就启动一个新的shell进程来进行执行。但是有很多shell,如图:

我们程序第一行看到是#!/bin/sh,这时,命令行就启用一个新的bash进程来执行程序。

程序执行差异

在我们运行shell程序的三种方法中,前两种方法的执行过程如下:

(1)父进程接收到命令,然后发现不是内建命令,于是创建了一个和自己一样的shell进程,来执行这个外部命令

(2)这个shell子进程用/bin/sh取代自己,sh进程设置自己的运行环境变量,其中包括了$PWD变量。

(3)sh进程依次执行内建命令cd和echo。在此过程中,sh进程(子进程)的环境变量被cd命令改变。

(4)子进程执行完毕,就消亡了,一直在等待的父进程醒来,继续接受命令。

所以我们明白了前两种方法执行结果跟我们预期不一样的原因,父进程的当前目录(环境变量)无法被子进程改变。

但是,使用source执行是shell脚本时不会创建子进程,而是在父进程中直接执行。至此黑人问号消失,继续加油写代码吧。

本文原创地址: 作者:王毅,审核员:逄增宝

原文地址:https://www.cnblogs.com/Stephen-Qin/p/11300091.html

时间: 2024-10-31 17:00:09

如何运行linux shell程序的相关文章

Linux Shell 程序调试

Linux Shell 程序调试 Shell程序的调试是通过运行程序时加入相关调试选项或在脚本程序中加入相关语句,让shell程序在执行过程中显示出一些可供参考的"调试信息".当然,用户也可以在shell程序中的适当位置加入一些echo命令用于调试与跟踪.   方法一:在运行脚本程序时加入调试选项: [用法]bash –选项 ./shellScript.sh 几个常用的调试选择项如下:         -e :如果一个命令返回一个非0退出状态值(失败),就退出.         -n 

linux shell程序常用功能

一.循环读取文件 循环读取文件方式有多种,推荐下列方法 while read line;do local include=$(echo ${line} | grep "filter" | wc -l) if [ ${include} -eq 0 ];then exit 1 fi done < /tmp/xxx 如上程序中,如果遇到某行内容不包含"filter",则退出程序. cat /tmp/xxx | while read line;do local inc

linux shell编程

1.什么是shell 2. 还是hello world程序 3. shell中的变量 3.1 系统变量 3.2 用户定义变量 3.2.1 用户定义变量规则 3.2.3 shell如何使用变量 3.2.3 全局变量 vs 局部变量 4. shell编程中的控制结构 4.1 条件判定 4.1.1 简单条件判定 4.1.2 组合判定 4.2  if - else 4.3 for 4.4 while 4.5 case 5. shell中的函数 5.1 函数声明和定义 5.2 函数调用 6. shell脚

在window上使用 linux shell 删除文件夹递归地

目的 在windows环境下, 整理代码,代码中含有 .svn 文件夹, 此文件夹在所有受控目录下都存在, 需要统一删除. 但是对windows的shell不熟悉,想用linux rm来删除, 如何实现? 方法 1.找到运行linux shell的工具, cygwin限制为安装目录. git工具可以执行shell,正适合此场景. 2. 鼠标右键点击目录目录, 选择 “git bash here” 3. 执行如下命令: find . -name ".svn"  | xargs rm -r

Linux shell 常见报错

linux shell 程序提示出错 ./13.3.sh: line 5: [: missing `]' 要如何解决????? 解决: [ ] 或者说 test : 两边的中括号前后都要是空格;

Linux shell指令运行的原理

shell是一种命令行解释器 对于一般用户,我们不能直接使用操作系统(kernel).而是通过 kernel的"外壳"程序,也就是所谓的shell,来与kernel沟通.    为什么不能直接使用kernel?    从 技 术 角 度 , Shell 的 最 简 单 定 义 : 命 令 行 解 释 器(command Interpreter)主要包含:    a. 将使用者的命令翻译给核心(kernel)处理.    b. 同时,将核心的处理结果翻译给使用者.    对于window

Linux Shell常用技巧(八) 系统运行状况

Linux Shell常用技巧(八) 系统运行状况 十八.  和系统运行状况相关的Shell命令:    1.  Linux的实时监测命令(watch):     watch   是一个非常实用的命令,可以帮你实时监测一个命令的运行结果,省得一遍又一遍的手动运行.该命令最为常用的两个选项是-d和-n,其中-n表示间隔多少秒 执行一次"command",-d表示高亮发生变化的位置.下面列举几个在watch中常用的实时监视命令:    /> watch -d -n 1 'who'  

Linux Shell常用技巧(九) 系统运行进程

Linux Shell常用技巧(九) 系统运行进程 十九.  和系统运行进程相关的Shell命令:       1.  进程监控命令(ps):      要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令.使用该命令可以 确定有哪些进程正在运行和运行的状态.进程是否结束.进程有没有僵死.哪些进程占用了过多的资源等等.总之大部分信息都是可以通过执行该命令得到的.    ps命令存在很多的命令行选项和参数,然而我们最为常用

如何运行linux程序

导读 搞懂linux程序如何运行是一件重要的事情,这是为我们进一步发展打下了坚实基础的一步.本文将通过实例来详细地讲解如何运行linux程序.希望对于大家理解有帮助. 首先,我们从一个十分简单的例子test.sh开始吧: #!/bin/sh #this is a test. cd /tmp echo "hello,this is a test" 这是一个十分简单的程序,但是运行结果可能会让你吃惊哦! 这个时候,我们发现程序运行之后,并没有改变当前目录.(黑人问号???) 别着急,我们先