【Shell脚本】运行shell脚本文件的几种方法与区别
来源:互联网 发布:宋理宗 知乎 编辑:程序博客网 时间:2024/05/24 06:50
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脚本文件的几种方法与区别
- 执行shell脚本的几种方法
- 执行shell脚本的几种方法
- 单独运行shell脚本与crontab运行shell脚本的区别
- [Linux]不同方法运行shell脚本的区别
- 运行Shell脚本的几种方式解析
- Shell脚本的运行
- Shell脚本的几种执行方式之区别
- shell与subshell与执行脚本的几种方式
- shell 运行 jar 文件脚本
- 运行 Shell 脚本有两种方法
- shell脚本字符串分割的几种方法
- Linux执行SHELL脚本的几种方法
- bash shell脚本执行的几种方法
- bash shell脚本执行的几种方法
- Shell脚本去重的几种方法实例
- shell脚本----[]与[[ ]]的区别与联系
- shell 脚本 与 shell 脚本的编写
- HTML5<video>背景大视频响应式布局完美支持
- First Missing Positive
- leading dimension
- HDU4970 Killing Monsters (2014多校第九场第11题)
- IIS7配置Gzip压缩
- 【Shell脚本】运行shell脚本文件的几种方法与区别
- Python3基础(十) 类的初印象
- java中相对路径和绝对路径
- 技术型创业者容易遇到的三大问题
- Android 开源库获取途径整理
- 黑马程序员 :(反射应用 )通过反射讲<Integer>类型的集合中添加一个<String>类型的数据
- LA 4728 Square ,旋转卡壳法求多边形的直径
- Qt工程文件(.pro文件)解读
- QT 项目文件介绍