Shell 的命令种类
内部命令
- shell 解释器本身包含的命令,在文件系统中没有相应的可执行文件,不能用“sudo”。
- 如:cd 、echo 、source 等。
- 在执行内部命令时,不需要创建新进程
- source 命令也称为“点命令”,可以用点符号(“ . ”)代替
- shell 函数 : 以 shell 语言书写的一系列程序代码,可以像其他命令一样被引用
外部命令
- 独立于 Shell 的可执行程序,在文件系统中有相应的可执行文件
- 如: ls , find , locate , grep , ifconfig 等
- 命令行会创建一个当前 Shell 的复制进程来执行它,执行过程存在进程的创建和销毁
- 子进程改变的环境变量只影响本进程,而不会影响父进程($PWD)
Shell 执行命令的顺序
顺序
- 别名
- 关键字
- 函数
- 内部命令
- 外部命令
在同名时,别名的优先级最高,而外部命令的优先级最低
内部命令 “ type ”
注释、退出状态 和 逻辑操作
注释
- 以 “ # ” 开头的文本表示注释, Shell 解释器将忽略 “ # ” 之后的所有内容
- 如果要将 “ # ” 作为普通字符对待,需在其之前加 “ \ ” 进行转义, 或使用引号对其进行引用
# echo this will not show //这是不会显示出来的
echo # this will not show // 只有 在“#”后面的才不被显示出来
echo \# this is common text
//输出结果为 # this is common text
退出状态
- 每一条 Shell 命令在退出时都会返回一个整数值给命令行 Shell
- “ 退出状态 ” 用于指示命令的运行情况: 成功还是失败。 如果失败,是什么原因导致的失败
- 一般约定以 0 表示成功, 非零值表示失败
- 使用特殊变量 “ $? ” 可以查看上一条命令的退出状态值
echo this should
// 输出结果为 succeed.
// 输出结果为 this should succeed
echo $?
// 输出结果为 0
rm /tmp
// 输出结果为 rm: cannot remove '/tmp': Permission denied
echo ?
// 输出结果为 1
逻辑操作
- 一般情况下,脚本程序中的各命令是从上到下顺序执行的,不论上一条命令执行是否成功(退出状态为 0 ),下一条命令都能得到执行
- 各条命令可以分行书写; 也可以在一行中书写,但各命令之间要以 “ ; ” 分隔开来,执行时按从左到右的顺序依次执行
- 除了使用 “ ; ” 连接命令之外,还可以使用逻辑与(“ && ”) 运算符和逻辑或运算符(“ || ”)连接两条命令。 “ ! ” 亦可用
- “ && ” 和 “ || ” 均具有短路特性
source 命令
source 命令是一个内置的 shell 命令,用于从当前 shell 会话中的文件读取和执行命令。
source 命令通常用于保留 、 更改当前 shell 中的环境变量。
简而言之, source 是一个脚本,将会在当前 shell 中运行 execute 命令。
source 命令可以用于:
- 刷新当前的 shell 环境
- 在当前环境中使用 source 执行 Shell 脚本
- 从脚本中导入环境中一个 Shell 函数
- 从另一个 Shell 脚本中读取变量
source 命令的语法
source 命令它需要一个文件,如果提供了参数,那么将用作传递脚本的位置参数。
source fileName [Arguments]
也可以使用 “ . ” 代替 source 命令:
. fileName [Arguments]
shell 命令用法
以下内容来源([source命令的用法](https://zhuanlan.zhihu.com/p/357335122))
总结:
source 命令在当前 shell 中执行脚本 而 exec 命令在新的 shell 中运行