`

shell入门

 
阅读更多

 

执行交互式命令

用户在命令行输入命令后,一般情况下Shell会forkexec 该命令,但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程。以前学过的cdaliasumaskexit 等命令即是内建命令,凡是用which 命令查不到程序文件所在位置的命令都是内建命令,内建命令没有单独的man手册,要在man手册中查看内建命令,应该

$ man bash-builtins

本节会介绍很多内建命令,如exportshiftifeval[forwhile 等等。内建命令虽然不创建新的进程,但也会有Exit Status,通常也用0表示成功非零表示失败,虽然内建命令不创建新的进程,但执行结束后也会有一个状态码,也可以用特殊变量$? 读出。

 

执行脚本

 

 

script.sh

#! /bin/sh

cd ..
ls

第一行开头,并且是#! (称为Shebang),表示该脚本使用后面指定的解释器/bin/sh 解释执行。如果把这个脚本文件加上可执行权限然后执行:

$ chmod +x script.sh
$ ./script.sh

执行上述脚本相当于执行程序

$ /bin/sh ./script.sh

不过后一种方式执行的好处是不需要script.sh 文件具有可执行权限。

交互Shell(bashfork /exec 一个子Shell(sh )用于执行脚本,父进程bash 等待子进程sh 终止。

 

如果将命令行下输入的命令用()括号括起来,那么也会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下逐行执行脚本中的命令。

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics