【shell】shell命令
一、shell命令的基本格式
[]
表示可选的,也就是可有可无。有些命令不写选项和参数也能执行,有些命令在必要的时候可以附带选项和参数。
command [选项] [参数]
1.1、使用选项
短格式选项和长格式选项
Linux 的选项又分为短格式选项和长格式选项。
- 短格式选项是长格式选项的简写,用一个减号
-
和一个字母表示,例如ls -l
。 - 长格式选项是完整的英文单词,用两个减号
--
和一个单词表示,例如ls --all
。
一般情况下,短格式选项是长格式选项的缩写,也就是一个短格式选项会有对应的长格式选项。当然也有例外,比如 ls 命令的短格式选项-l
就没有对应的长格式选项,所以具体的命令选项还需要通过帮助手册来查询。
[mozhiyan@localhost demo]$ ls -l 总用量 140 -rwxrwxr-x. 1 mozhiyan mozhiyan 8675 4月 2 15:01 a.out -rwxr-xr-x. 1 mozhiyan mozhiyan 116 4月 3 09:24 a.sh
1.2、使用参数
参数是命令的操作对象,一般情况下,文件、目录、用户和进程等都可以作为参数被命令操作。例如:
[mozhiyan@localhost demo]$ ls -l main.c -rw-rw-r--. 1 mozhiyan mozhiyan 650 4月 10 11:06 main.c
选项和参数一起使用
Shell 命令可以同时附带选项和参数,例如:
[mozhiyan@localhost ~]$ echo "http://c.biancheng.net/shell/" http://c.biancheng.net/shell/ [mozhiyan@localhost ~]$ echo -n "http://c.biancheng.net/shell/" http://c.biancheng.net/shell/[mozhiyan@localhost ~]$
-n
是 echo 命令的选项,"http://c.biancheng.net/shell/"
是 echo 命令的参数,它们被同时用于 echo 命令。
echo 命令用来输出一个字符串,默认输出完成后会换行;给它增加-n
选项,就不会换行了。
1.3、选项附带的参数
有些命令的选项后面也可以附带参数,这些参数用来补全选项,或者调整选项的功能细节。
例如,read 命令用来读取用户输入的数据,并把读取到的数据赋值给一个变量,它通常的用法为:
read str
str 为变量名。
如果我们只是想读取固定长度的字符串,那么可以给 read 命令增加-n
选项。比如读取一个字符作为性别的标志,那么可以这样写:
read -n 1 sex
1
是-n
选项的参数,sex
是 read 命令的参数。-n
选项表示读取固定长度的字符串,那么它后面必然要跟一个数字用来指明长度,否则选项是不完整的。
二、shell命令的分类
Shell 命令分为两种:
- 内置命令:Shell 自带的命令称为内置命令,它在 Shell 内部可以通过函数来实现,当 Shell 启动后,这些命令所对应的代码(函数体代码)也被加载到内存中,所以使用内置命令是非常快速的。
- 外部命令:更多的命令是外部的应用程序,一个命令就对应一个应用程序。运行外部命令要开启一个新的进程,所以效率上比内置命令差很多。
一个 Shell 内置命令就是一个内部的函数,
一个外部命令就是一个应用程序。
内置命令后面附带的所有数据(所有选项和参数)最终都以参数的形式传递给了函数,
外部命令后面附带的所有数据(所有选项和参数)最终都以参数的形式传递给了应用程序。
命令后面附带的数据并不是被合并在一起,作为一个参数传递给函数的;这些数据是由空格分隔的,它们被分隔成了几份,就会转换成几个参数。
例如getsum -s 1 -e 100
要向函数传递四个参数,read -n 1 sex
要向函数中传递三个参数。
2.1、内置命令
内置命令不宜过多,过多的内置命令会导致 Shell 程序本身体积膨胀,运行 Shell 程序后就会占用更多的内存。Shell 是一个常驻内存的程序,占用过多内存会影响其它的程序。
只有那些最常用的命令才有理由成为内置命令,比如 cd、kill、echo 等;你可以转到《Shell内置命令》来了解所有的内置命令,以及如何判断一个命令是否是内置命令。
https://c.biancheng.net/view/1136.html
命令 | 说明 |
---|---|
: | 扩展参数列表,执行重定向操作 |
. | 读取并执行指定文件中的命令(在当前 shell 环境中) |
alias | 为指定命令定义一个别名 |
bg | 将作业以后台模式运行 |
bind | 将键盘序列绑定到一个 readline 函数或宏 |
break | 退出 for、while、select 或 until 循环 |
builtin | 执行指定的 shell 内建命令 |
caller | 返回活动子函数调用的上下文 |
cd | 将当前目录切换为指定的目录 |
command | 执行指定的命令,无需进行通常的 shell 查找 |
compgen | 为指定单词生成可能的补全匹配 |
complete | 显示指定的单词是如何补全的 |
compopt | 修改指定单词的补全选项 |
continue | 继续执行 for、while、select 或 until 循环的下一次迭代 |
declare | 声明一个变量或变量类型。 |
dirs | 显示当前存储目录的列表 |
disown | 从进程作业表中刪除指定的作业 |
echo | 将指定字符串输出到 STDOUT |
enable | 启用或禁用指定的内建shell命令 |
eval | 将指定的参数拼接成一个命令,然后执行该命令 |
exec | 用指定命令替换 shell 进程 |
exit | 强制 shell 以指定的退出状态码退出 |
export | 设置子 shell 进程可用的变量 |
fc | 从历史记录中选择命令列表 |
fg | 将作业以前台模式运行 |
getopts | 分析指定的位置参数 |
hash | 查找并记住指定命令的全路径名 |
help | 显示帮助文件 |
history | 显示命令历史记录 |
jobs | 列出活动作业 |
kill | 向指定的进程 ID(PID) 发送一个系统信号 |
let | 计算一个数学表达式中的每个参数 |
local | 在函数中创建一个作用域受限的变量 |
logout | 退出登录 shell |
mapfile | 从 STDIN 读取数据行,并将其加入索引数组 |
popd | 从目录栈中删除记录 |
printf | 使用格式化字符串显示文本 |
pushd | 向目录栈添加一个目录 |
pwd | 显示当前工作目录的路径名 |
read | 从 STDIN 读取一行数据并将其赋给一个变量 |
readarray | 从 STDIN 读取数据行并将其放入索引数组 |
readonly | 从 STDIN 读取一行数据并将其赋给一个不可修改的变量 |
return | 强制函数以某个值退出,这个值可以被调用脚本提取 |
set | 设置并显示环境变量的值和 shell 属性 |
shift | 将位置参数依次向下降一个位置 |
shopt | 打开/关闭控制 shell 可选行为的变量值 |
source | 读取并执行指定文件中的命令(在当前 shell 环境中) |
suspend | 暂停 Shell 的执行,直到收到一个 SIGCONT 信号 |
test | 基于指定条件返回退出状态码 0 或 1 |
times | 显示累计的用户和系统时间 |
trap | 如果收到了指定的系统信号,执行指定的命令 |
type | 显示指定的单词如果作为命令将会如何被解释 |
typeset | 声明一个变量或变量类型。 |
ulimit | 为系统用户设置指定的资源的上限 |
umask | 为新建的文件和目录设置默认权限 |
unalias | 刪除指定的别名 |
unset | 刪除指定的环境变量或 shell 属性 |
wait | 等待指定的进程完成,并返回退出状态码 |
2.2、外部命令
外部命令可能是读者比较疑惑的,一个外部的应用程序究竟是如何变成一个 Shell 命令的呢?
应用程序就是一个文件,只不过这个文件是可以执行的。既然是文件,那么它就有一个名字,并且存放在文件系统中。用户在 Shell 中输入一个外部命令后,只是将可执行文件的名字告诉了 Shell,但是并没有告诉 Shell 去哪里寻找这个文件。
难道 Shell 要遍历整个文件系统,查看每个目录吗?这显然是不能实现的。
为了解决这个问题,Shell 在启动文件中增加了一个叫做 PATH 的环境变量,该变量就保存了 Shell 对外部命令的查找路径,如果在这些路径下找不到同名的文件,Shell 也不会再去其它路径下查找了,它就直接报错。
你不用关心启动文件(我们将在《Shell启动文件》中详解),只需要知道 PATH 变量保存了检索路径即可。
我们使用 echo 命令输出 PATH 变量的值,看看它保存了哪些检索路径:
[mozhiyan@localhost ~]$ echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/mozhiyan/.local/bin:/home/mozhiyan/bin
不同的路径之间以:
分隔。你看,Shell 只会在几个固定的路径中查找外部命令。
如果我们自己用C语言或者 C++ 编写一个应用程序,并将它放到这几个目录下面,那么我们的程序也会成为 Shell 命令。当然,你也可以修改 PATH 变量给它增加另外的路径,不过这并不是本文的重点,有兴趣的读者请转到《编写自己的Shell配置文件》。
总结
Shell 内置命令的本质是一个自带的函数,执行内置命令就是调用这个自带的函数。因为函数代码在 Shell 启动时已经被加载到内存了,所以内置命令的执行速度很快。
Shell 外部命令的本质是一个应用程序,执行外部命令就是启动一个新的应用程序。因为要创建新的进程并加载应用程序的代码,所以外部命令的执行速度很慢。