- 命令的运行是从上而下、从左而右的分析与运行;
- 命令的下达就如同第五章内提到的: 命令、选项与参数间的多个空白都会被忽略掉;
- 空白行也将被忽略掉,并且 [tab] 按键所推开的空白同样视为空白键;
- 如果读取到一个 Enter 符号 (CR) ,就尝试开始运行该行 (或该串) 命令;
- 至於如果一行的内容太多,则可以使用『 \[Enter] 』来延伸至下一行;
- 『 # 』可做为注解!任何加在 # 后面的数据将全部被视为注解文字而被忽略!
如此一来,我们在 script 内所撰写的程序,就会被一行一行的运行。现在我们假设你写的这个程序档名是 /home/dmtsai/shell.sh 好了,那如何运行这个文件?很简单,可以有底下几个方法:
- 直接命令下达: shell.sh 文件必须要具备可读与可运行 (rx) 的权限,然后:
- 绝对路径:使用 /home/dmtsai/shell.sh 来下达命令;
- 相对路径:假设工作目录在 /home/dmtsai/ ,则使用 ./shell.sh 来运行
- 变量『PATH』功能:将 shell.sh 放在 PATH 指定的目录内,例如: ~/bin/
- 以 bash 程序来运行:透过『 bash shell.sh 』或『 sh shell.sh 』来运行
反正重点就是要让那个 shell.sh 内的命令可以被运行的意思啦! 咦!那我为何需要使用 『./shell.sh 』来下达命令?忘记了吗?回去第十一章内的命令搜寻顺序察看一下, 你就会知道原因了!同时,由於 CentOS 默认使用者家目录下的 ~/bin 目录会被配置到 $PATH 内,所以你也可以将 shell.sh 创建在 /home/dmtsai/bin/ 底下 ( ~/bin 目录需要自行配置) 。此时,若shell.sh 在 ~/bin 内且具有 rx 的权限,那就直接输入 shell.sh 即可运行该脚本程序!
那为何『 sh shell.sh 』也可以运行呢?这是因为 /bin/sh 其实就是 /bin/bash (连结档),使用 sh shell.sh 亦即告诉系统,我想要直接以 bash 的功能来运行 shell.sh 这个文件内的相关命令的意思,所以此时你的 shell.sh 只要有 r 的权限即可被运行喔!而我们也可以利用 sh 的参数,如 -n 及 -x 来检查与追踪 shell.sh 的语法是否正确呢! ^_^
路径与命令搜寻顺序
我们在第六章与第七章都曾谈过『相对路径与绝对路径』的关系, 在本章的前几小节也谈到了 alias 与 bash 的内建命令。现在我们知道系统里面其实有不少的 ls 命令, 或者是包括内建的 echo 命令,那么来想一想,如果一个命令 (例如 ls) 被下达时, 到底是哪一个 ls 被拿来运行?很有趣吧!基本上,命令运行的顺序可以这样看:
- 以相对/绝对路径运行命令,例如『 /bin/ls 』或『 ./ls 』;
- 由 alias 找到该命令来运行;
- 由 bash 内建的 (builtin) 命令来运行;
- 透过 $PATH 这个变量的顺序搜寻到的第一个命令来运行。
举例来说,你可以下达 /bin/ls 及单纯的 ls 看看,会发现使用 ls 有颜色但是 /bin/ls 则没有颜色。 因为 /bin/ls 是直接取用该命令来下达,而 ls 会因为『 alias ls='ls --color=tty' 』这个命令别名而先使用! 如果想要了解命令搜寻的顺序,其实透过 type -a ls 也可以查询的到啦!上述的顺序最好先了解喔!
例题:
配置 echo 的命令别名成为 echo -n ,然后再观察 echo 运行的顺序
答:
|