zoukankan      html  css  js  c++  java
  • 【Shell脚本】运行shell脚本文件的几种方法与区别

    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'
    ", 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?)。


  • 相关阅读:
    discuz Ucenter第三方双向同步登录
    python: 输出 1~100 之间不能被 7 整除的数,每行输出 10 个数字,要求应用字符串格式化方法美化输出格式。
    用python语言来判断一个数是否是水仙花数?
    java如何调用webservice接口
    ASP.NET 全局变量和页面间传值方法
    从客户端中检测到有潜在危险的 Request.Form 值] 处理办法
    第一次作业要点及重要属性
    Servlet生命周期
    cookie与session的比较
    零基础学习HTML5
  • 原文地址:https://www.cnblogs.com/xhyzjiji/p/6159370.html
Copyright © 2011-2022 走看看