Shell脚本不同的运行方式会对当前Shell设置或者运行结果有所不同。

假设现在有一个脚本名为display_shell_script_args.sh,其内容如下:

#!/home/pyf/bin/echoarg arg_infile other_arg_infile 
echo $#
while [ $# != '0' ]
do
echo $0
done
echo $0
echo "Hello, shell!"
echo -e "Hello, sh!"

这里的echoarg是自己编译生成的一个可执行文件,其内容如下:

#include "stdio.h"
#include "stdlib.h" int main(int argc, char* argv[]){
int i; for(i=0; i<argc; i++){
printf("echoarg argv[%d]='%s'\n", i, argv[i]);
} exit(0);
}

echoarg主要负责打印所有传递参数。

1.使用sh、bash等命令运行脚本

此时,不需要脚本文件(display_shell_script_args.sh)具有可执行的权限;

当前Shell会fork出一个新的子进程并wait子进程结束,并尝试用sh、bash等指定的命令解释脚本文件,所以脚本文件中的#!一行所指定的解释器及其参数将失效;

脚本文件内容当成命令行参数传递给sh、bash等。

那么,使用sh display_shell_script_args.sh活着sh ./display_shell_script_args.sh的运行结果呢,由于sh代替了脚本文件的解释器,所以参数个数以sh的参数为准,这里sh只有一个参数,就是display_shell_script_args.sh,因此运行结果为

0

display_shell_script_args.sh

Hello, shell!

Hello, sh!

这里,原解释器参数arg_infile other_arg_infile被忽略了。

2.直接运行脚本文件

此时,必须保证当前用户具有执行此文件的权限,chmod就派上用场了。

直接运行脚本文件有两种方式:

i)直接输入命令./display_shell_script_args.sh,因为display_shell_script_args.sh非正式shell命令,所以这里需要指定可执行文件的相对或者绝对路径;

ii)先将脚本文件当前路径export到PATH环境变量中,然后直接输入display_shell_script_args.sh脚本文件名即可。

当前Shell依然会fork出一个新的子进程并wait子进程结束,然后子进程会调用(exec)脚本文件第一行#!中指定用来解释脚本文件的解释器/二进制可执行文件,根据解释器的功能对脚本文件进行解释。

所以,以./display_shell_script_args.sh arg1 arg2运行脚本的结果:

echoarg argv[0]='/home/pyf/bin/echoarg'

echoarg argv[1]='arg_infile other_arg_infile'

echoarg argv[2]='./display_shell_script_args.sh'

echoarg argv[3]='arg1'

echoarg argv[4]='arg2'

由于我写的echoarg只输出当前传递到echoarg的参数,并为对脚本中的语句进行解释。

我们又可以从上面的显示,得出解释器获得参数的顺序:

第一个参数:可执行文件的绝对路径;第二个参数:第一行#!解释器绝对路径后紧跟的字符串作为第二个参数(不会理会空格或者制表符等常用分隔符);第三个参数:在父进程shell中运行的命令;其他参数:输入命令后的参数列表。

命令展开后,相当于/home/pyf/bin/echoarg ./display_shell_script_args.sh。

3.source或.运行脚本文件

此时,将使用当前的shell解释脚本文件,但不会fork产生子进程,所以脚本文件的执行将直接影响当前shell的环境变量。

那么输入命令source display_shell_script_args.sh或. display_shell_script_args.sh结果为

0

bash

Hello, shell!

Hello, sh!

注意此时,$0打印结果是当前使用的shell,而不是文件名display_shell_script_args.sh(why?)。

【Shell脚本】运行shell脚本文件的几种方法与区别的更多相关文章

  1. .NET读取Excel文件的三种方法的区别

    ASP.NET读取Excel文件方法一:采用OleDB读取Excel文件: 把Excel文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(strin ...

  2. Shell脚本中引用、调用另一个脚本文件的2种方法

    Shell脚本中引用.调用另一个脚本文件的2种方法 http://www.jb51.net/article/67903.htm

  3. 执行shell脚本的几种方法及区别

    执行shell脚本的几种方法及区别 http://blog.csdn.net/lanxinju/article/details/6032368 (认真看) 注意:如果涉及到脚本之间的调用一定要用 . ...

  4. MySQL命令执行sql文件的两种方法

    MySQL命令执行sql文件的两种方法 摘要:和其他数据库一样,MySQL也提供了命令执行sql脚本文件,方便地进行数据库.表以及数据等各种操作.下面笔者讲解MySQL执行sql文件命令的两种方法,希 ...

  5. 【转】 分析iOS Crash文件:符号化iOS Crash文件的3种方法

    当你的应用提交到AppStore或者各个渠道之后,请问你多久会拿到crash文件?你如何分析crash文件的呢? 上传crash文件 你的应用应当有模块能够在应用程序crash的时候上传crash信息 ...

  6. 分析iOS Crash文件:符号化iOS Crash文件的3种方法

    转自:http://www.cocoachina.com/industry/20140514/8418.html 转自wufawei的博客 当你的应用提交到App Store或者各个渠道之后,请问你多 ...

  7. Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

  8. 合并BIN文件的两种方法(转)

    源:http://blog.chinaunix.net/uid-20745340-id-1878803.html 合并BIN文件的两种方法 在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一 ...

  9. elf格式转换为hex格式文件的两种方法

    这周工作终于不太忙了,可以写点笔记总结一下了. 之前的文章如何在Keil-MDK开发环境生成Bin格式文件,介绍了如何在Keil开发环境使用fromelf软件,将生成的axf文件转换为bin文件,这次 ...

随机推荐

  1. 关于Yeoman使用的总结

    Yeoman由三部分组成 Yo 用于项目构建. Grunt 用于项目管理,任务制定. Bower 用于项目依赖管理. 经过一段时间的使用,对这些东西有了一些个人总结: 总体上说这些内容学习曲线略高,不 ...

  2. 微信开放JS-SDK,助力网页开发

    From:http://mp.weixin.qq.com/s?__biz=MjM5NDAwMTA2MA==&mid=209208141&idx=1&sn=1f075212b34 ...

  3. 3Sum Smaller 解答

    Question Given an array of n integers nums and a target, find the number of index triplets i, j, k w ...

  4. MySQL中多表删除方法(转载)

    如果您是才接触MySQL数据库的新人,那么MySQL中多表删除是您一定需要掌握的,下面就将为详细介绍MySQL中多表删除的方法,供您参考,希望对你学习掌握MySQL中多表删除能有所帮助. 1.从MyS ...

  5. DirectX 初始化DirectX(手写和红龙书里面的方式)

    上次介绍了如何初始化Direct3D,这次手写一次初始化代码,都是一样的方式不过看起来整洁一点. 创建一个Win32空项目添加一个空类增加以下代码即可. #include "CreateDe ...

  6. Velocity知识点总结

    Velocity知识点总结 1. 变量 (1)变量的定义: #set($name = "hello") 说明:velocity中变量是弱类型的. 当使用#set 指令时,括在双引號 ...

  7. ProFTPD“killed (signal 15)”自动退出问题解决

    proftpd服务端每隔几天就重启一次,日志如下: 看起来这又像是一个仅有两行日志的无头案了.不过由于日志明确给出了退出信号“killed (signal 15)”,因此Google的话还是比较简单找 ...

  8. [core java学习笔记][第十章部署应用程序]

    第10章 部署应用程序和applet jar文件 Java Web Start 10.1 jar文件 jar文件就是一个压缩了类,图像和声音的ZIP压缩文件 创建一个新的JAR文件应该使用的常见命令格 ...

  9. nginx搭建flv、mp4流媒体服务

    1.安装pcre-8.33.tar.bz2 #tar -xvf 1.pcre-8.33.tar.bz2 #cd pcre-8.33/ #./configure #make && mak ...

  10. 使用 Require.js 引用第三方框架时遇到的一些情况

    使用 Require.js 引用第三方框架时遇到的一些情况 在使用Require.js解析依赖的时候,会出现以下几种情况: 程序中的依赖关系 当前程序 依赖于 B包, B包 依赖于 A包 A包与B包两 ...