Linux -- Shell 执行方式
2013-03-29 09:40
134 查看
想写这篇文章还得从执行一个脚本说起
nohup sh run.sh &
看到这样执行脚本的方式,刚开始有点不知所措,经过一番理解之后才发现这样的执行方式考虑的真的很周全
用sh执行脚本好处是不管脚本有没有执行权限都可以被执行
【不管相对路径./run.sh还是绝对路径执行/home/sas/CMNEW/AdventNet/Sas/bin/run.sh ,都需要执行权限】
&符号表示将脚本放到后台执行,但是如果关闭当前的终端的话,脚本就会被终止
如果加上nohup再执行脚本的话,即使终端被关闭,脚本也会继续在后台执行
所以nohup和&是双保险
nohup sh run.sh & 就是为了安全并顺利地执行脚本
下面主要介绍执行shell脚本的几种方式
本节会介绍很多内建命令,如
Status,通常也用0表示成功非零表示失败,虽然内建命令不创建新的进程,但执行结束后也会有一个状态码,也可以用特殊变量
例 31.1. 简单的Shell脚本
Shell脚本中用
Shell会
以这种方式执行不需要
执行
以上介绍了两种执行Shell脚本的方法:
这两种方法本质上是一样的,执行上述脚本的步骤为:
图 31.1. Shell脚本的执行过程
交互Shell(
如果将命令行下输入的命令用()括号括起来,那么也会
和上面两种方法执行Shell脚本的效果是相同的,
则有不同的效果,
或者
nohup sh run.sh &
看到这样执行脚本的方式,刚开始有点不知所措,经过一番理解之后才发现这样的执行方式考虑的真的很周全
用sh执行脚本好处是不管脚本有没有执行权限都可以被执行
【不管相对路径./run.sh还是绝对路径执行/home/sas/CMNEW/AdventNet/Sas/bin/run.sh ,都需要执行权限】
&符号表示将脚本放到后台执行,但是如果关闭当前的终端的话,脚本就会被终止
如果加上nohup再执行脚本的话,即使终端被关闭,脚本也会继续在后台执行
所以nohup和&是双保险
nohup sh run.sh & 就是为了安全并顺利地执行脚本
下面主要介绍执行shell脚本的几种方式
执行交互式命令
用户在命令行输入命令后,一般情况下Shell会fork并
exec该命令,但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程。以前学过的
cd、
alias、
umask、
exit等命令即是内建命令,凡是用
which命令查不到程序文件所在位置的命令都是内建命令,内建命令没有单独的man手册,要在man手册中查看内建命令,应该
$ man bash-builtins
本节会介绍很多内建命令,如
export、
shift、
if、
eval、
[、
for、
while等等。内建命令虽然不创建新的进程,但也会有Exit
Status,通常也用0表示成功非零表示失败,虽然内建命令不创建新的进程,但执行结束后也会有一个状态码,也可以用特殊变量
$?读出。
执行脚本
首先编写一个简单的脚本,保存为script.sh:
例 31.1. 简单的Shell脚本
#! /bin/sh cd .. ls
Shell脚本中用
#表示注释,相当于C语言的
//注释。但如果
#位于第一行开头,并且是
#!(称为Shebang)则例外,它表示该脚本使用后面指定的解释器
/bin/sh解释执行。如果把这个脚本文件加上可执行权限然后执行:
$ chmod +x script.sh $ ./script.sh
Shell会
fork一个子进程并调用
exec执行
./script.sh这个程序,
exec系统调用应该把子进程的代码段替换成
./script.sh程序的代码段,并从它的
_start开始执行。然而
script.sh是个文本文件,根本没有代码段和
_start函数,怎么办呢?其实
exec还有另外一种机制,如果要执行的是一个文本文件,并且第一行用Shebang指定了解释器,则用解释器程序的代码段替换当前进程,并且从解释器的
_start开始执行,而这个文本文件被当作命令行参数传给解释器。因此,执行上述脚本相当于执行程序
$ /bin/sh ./script.sh
以这种方式执行不需要
script.sh文件具有可执行权限。再举个例子,比如某个
sed脚本的文件名是
script,它的开头是
#! /bin/sed -f
执行
./script相当于执行程序
$ /bin/sed -f ./script.sh
以上介绍了两种执行Shell脚本的方法:
$ ./script.sh $ sh ./script.sh
这两种方法本质上是一样的,执行上述脚本的步骤为:
图 31.1. Shell脚本的执行过程
交互Shell(
bash)
fork/
exec一个子Shell(
sh)用于执行脚本,父进程
bash等待子进程
sh终止。
sh读取脚本中的
cd ..命令,调用相应的函数执行内建命令,改变当前工作目录为上一级目录。
sh读取脚本中的
ls命令,
fork/
exec这个程序,列出当前工作目录下的文件,
sh等待
ls终止。
ls终止后,
sh继续执行,读到脚本文件末尾,
sh终止。
sh终止后,
bash继续执行,打印提示符等待用户输入。
如果将命令行下输入的命令用()括号括起来,那么也会
fork出一个子Shell执行小括号中的命令,一行中可以输入由分号;隔开的多个命令,比如:
$ (cd ..;ls -l)
和上面两种方法执行Shell脚本的效果是相同的,
cd ..命令改变的是子Shell的
PWD,而不会影响到交互式Shell。然而命令
$ cd ..;ls -l
则有不同的效果,
cd ..命令是直接在交互式Shell下执行的,改变交互式Shell的
PWD,然而这种方式相当于这样执行Shell脚本:
$ source ./script.sh
或者
$ . ./script.sh
source或者
.命令是Shell的内建命令,这种方式也不会创建子Shell,而是直接在交互式Shell下逐行执行脚本中的命令。
相关文章推荐
- Unix/Linux中后台运行程序(断开shell连接后继续执行)的几种方式
- Linux执行shell脚本方式及区别&命令后台运行
- Linux-Shell脚本执行方式
- Linux学习日记 —— 10.2 Shell基础-脚本执行方式
- Linux学习之——shell脚本的执行方式和快捷键
- linux学习笔记—shell脚本执行方式
- 在Linux下执行执行shell脚本和jar的各种方式
- Linux执行shell脚本方式及区别&命令后台运行
- 转:linux执行shell脚本的方式及一些区别
- linux执行shell脚本的方式及一些区别
- Linux执行shell脚本方式及区别&命令后台运行
- linux 执行shell脚本的方式及一些区别
- Linux 脚本执行方式 (Shell基础)
- Linux下shell与子shell及执行Script的几种方式
- linux执行shell脚本的方式及一些区别
- linux set --设置所使用shell的执行方式
- linux笔记:shell基础-概述和脚本执行方式
- Linux中shell的几种执行方式
- Linux下为可执行shell脚本文件(.sh),制作桌面启动快捷方式
- Linux执行shell脚本方式及区别&命令后台运行