Ict-创新/LPI/103.1
考生应该能够使用命令行与 Shell 和命令交互。目标假设使用 bash Shell。
关键知识领域
- 使用单个 Shell 命令和单行命令序列在命令行上执行基本任务。
- 使用和修改 Shell 环境,包括定义、引用和导出环境变量。
- 使用和编辑命令历史。
- 在定义的路径内外调用命令。
与计算机系统交互的基本方法是使用命令行。Shell 解释在键盘上输入的指令。Shell 提示符(以 $ 或 # 结尾,表示用户 root)表示它已准备好接收用户输入。
Shell 也是一个编程环境,可用于执行自动化任务。Shell 程序被称为脚本。
Bourne Shell | /bin/sh |
Bourne Again Shell | /bin/bash |
Korn Shell | /bin/ksh |
C Shell | /bin/csh |
Tom's C Shell | /bin/tcsh |
由于 bash Shell 是 Linux 世界中最广泛使用的 Shell 之一,因此 LPI 主要集中在这个 Shell 上。
Shell 命令通常采用以下形式
command [options] {arguments}.
bash Shell 使用 echo 命令将文本打印到屏幕上。
$ echo “this is a short line” |
完整路径/相对路径
Shell 将命令行上给出的任何字符串的第一个“单词”解释为一个命令。如果字符串是可执行文件的完整路径或相对路径,则启动可执行文件。如果第一个单词没有“/”字符,则 Shell 将扫描 PATH 变量中定义的目录,并尝试运行与该字符串匹配的第一个命令。
例如,如果 PATH 变量只包含目录 /bin 和 /usr/bin,则命令 xeyes 将找不到,因为它存储在 /usr/X11R6/bin/xeyes 中,因此需要使用完整路径
$ /usr/X11R6/bin/xeyes |
另一种方法是使用相对路径来输入可执行文件的完整路径。例如,如果用户在存储 xeyes 程序的目录中,则可以输入
$ ./xeyes |
上面的命令中的“.”表示当前工作目录。由于您已在当前目录中,因此该命令也可以简单地写成:(只有当“.”在您的搜索路径中时)
$ xeyes |
Shell 变量类似于任何计算语言中使用的变量。变量名仅限于字母数字字符。例如 CREDIT=300 只是将值 300 分配给名为 CREDIT 的变量。
1. 初始化变量 | Variable-Name=value(没有空格!!) |
2. 引用变量 | $Variable-Name |
CREDIT=300 echo $CREDIT |
可以使用 unset 命令删除变量的值。
导出、设置和 Env
变量有两种类型:局部变量和导出变量。
局部变量仅对当前 Shell 可访问。另一方面,导出变量可供 Shell 和从该 Shell 启动的任何子进程访问。
set 和 env 命令用于列出定义的变量
set | 列出所有变量 |
env | 列出所有导出变量 |
全局变量在任何子进程都可以引用它的意义上是全局的。下面的示例导出变量 credit,然后检查它是否按预期导出。
export CREDIT |
env | grep CREDIT |
常见预定义变量列表
DISPLAY | X 用于识别在哪里运行客户端应用程序 |
HISTFILE | 用户 .bash_history 文件的路径 |
HOME | 用户主目录的路径 |
LOGNAME | 用户用来登录的名称 |
PATH | Shell 在输入命令时搜索程序的目录列表,这些命令没有路径。 |
PWD | 当前工作目录 |
SHELL | 使用的 Shell(大多数 Linux 发行版中的 bash) |
TERM | 当前终端仿真 |
特殊变量
接下来的几个变量与进程管理相关。
$! 代表最后一个子进程的 PID 值 $$ 代表正在运行的 Shell 的 PID $? 如果上一个命令成功执行则为 0,否则为非零值 |
元字符和引号
元字符是 Shell 中具有特殊含义的字符。它们主要用于文件通配,即使用最少的字母来匹配多个文件或目录名称。输入 (<)、输出 (>) 和管道 (|) 字符也是特殊字符,以及用于变量的美元 ($) 符号。我们不会在此列出它们,但请注意,这些字符很少用于命名普通文件。
- * 通配符可以替换任意数量的字符。
$ ls /usr/bin/b* |
列出所有以 'b' 开头的程序
- ? 通配符可以替换任何一个字符。
$ ls /usr/bin/?b* |
列出所有第二个字母为 'b' 的程序
- [ ] 用于定义一个值的范围。
$ ls a[0-9] $ ls [!Aa]* |
第一行列出所有以 'a' 开头并在第二位有一个数字的文件。
第二行列出所有不以 'a' 或 'A' 开头的文件
- {string1,string2} 虽然不是文件命名通配符,但它可以用来生成具有共同词干的名称列表。
$ mkdir {mon, tues, wednes} day |
引号和转义代码
元字符的特殊含义可以通过转义字符来取消,转义字符也是元字符。
反斜杠 (\) 称为转义字符,它取消了紧随其后的字符的含义,迫使 Shell 按字面意思解释它。
单引号 (' ') 取消除反斜杠以外的所有元字符的含义。
双引号 (" ") 是最弱的引号,但会取消大多数包含字符的特殊含义,除了管道 (|)、反斜杠 (\) 和变量 ($var)。
反引号
反引号 `` 将执行封闭的命令并将其输出替换回命令行。下面的示例使用 date 命令定义变量 TIME。
$ TIME="Today's date is `date +%a:%d:%b`” echo $TIME Today's date is Sun:15:Jul |
另一种执行命令的方法(类似于反引号)是使用 $()。这将执行封闭的命令并将其视为变量。
$ TIME=$(date) |
要查看先前输入命令的列表,可以使用 bash 内置命令 history。
$ history
|
这列出了所有缓存的命令,以及保存在 ~/.bash_history 中的命令。当用户退出 Shell 时,缓存的命令将保存到 ~/.bash_history。
您可以使用键盘上的向上箭头和向下箭头来回忆命令。还有 emacs 键绑定,使您能够执行甚至编辑这些行。
Ctrl+P | 上一行(与向上箭头相同) |
Ctrl+n | 下一行(与向下箭头相同) |
Ctrl+b | 在行上向后退一个字符(与左箭头相同) |
Ctrl+f | 在行上向前移动一个字符(与右箭头相同) |
Ctrl+a | 移至行首(与<Home>相同) |
Ctrl+e | 移至行尾(与<End>相同) |
感叹号 (!) 键可用于重新运行命令。
示例
x 执行历史记录列表中以 'x' 开头的最新命令 | 2 运行历史记录输出中的命令编号 2 | -2 运行倒数第二个命令 | ! 运行最后一个命令 ^string1^string2 运行上一个命令并将 string1 替换为 string2 |
---|
其他命令
别名
您可以为需要多个参数的命令创建别名。创建别名的格式为
$ alias myprog='command [options]{arguments}' |
在命令行中仅键入 alias,您将获得当前定义的别名列表。
命令补全
按Tab键,shell 将完成您开始键入的命令。
command1; command2; command3 | 三个命令将依次运行,无论前一个命令是否成功 |
command1 && command2 && command3 | 每个命令只有在先前的退出代码为 0(成功)时才会执行 |
command1 || command2 || command3 | 下一个命令只有在先前的退出代码不为 0(失败)时才会执行 |
exec 命令
此命令不是二进制文件,而是 shell 的一部分。它用于启动其他命令。通常,如果执行一个命令,就会启动一个子进程。如果使用 exec 命令启动新程序,它将重新占用用于启动它的进程。它会替换当前 shell(在脚本或交互式 shell 中)。
当新命令终止时,控制不会传递回调用 shell,而是返回到调用用于执行 exec 调用的 shell 的进程。
$ echo $$ 414
$ echo $$ 455
hello $ echo $$ 455
hello $ echo $$ 414 |
上面的示例显示了在直接的 echo 和使用 exec 的第一个 shell(进程 414)之后,控制返回到第二个 shell(进程 455)。
手册页和 whatis 数据库
[edit | edit source]NAME | 项目的名称,后跟简短的一行描述。 |
SYNOPSYS | 命令的语法 |
DESCRIPTION | 更详细的描述 |
OPTIONS | 所有可能的选项及其功能的概述 |
FILES | 与当前项目相关的文件(配置文件等) |
SEE ALSO | 与当前主题相关的其他手册页 |
这些是手册页中可以预期找到的主要主题部分。
whatis 数据库存储系统上所有手册页的 NAME 部分。它通过每天的 cron 定期更新。whatis 数据库具有以下两个条目
whatis 的语法为
whatis <string>
输出是手册页的完整 NAME 部分,其中string 匹配named(key)
也可以使用 man 命令查询 whatis 数据库。语法为
man -k <string>
此命令类似于 apropos。与 whatis 不同,它将查询数据库的“名称”和“一行描述”条目。如果字符串与这些字段中的任何一个单词匹配,上述查询将返回完整的NAME 部分。
示例:(匹配的字符串已突出显示)
whatis lilo |
lilo (8) - install boot loader |
lilo.conf [lilo] (5) - configuration file for lilo |
man -k lilo |
grubby (8) - command line tool for configuring grub, lilo, and elilo |
lilo (8) - install boot loader |
lilo.conf [lilo] (5) - configuration file for lilo |
文件系统层次结构标准,一种推荐的 Linux 文件系统布局,建议将手册页保存在 /usr/share/man 中。但是,可以使用 /etc/man.config 中设置的 MANPATH 环境变量搜索其他位置。每个目录进一步划分为子目录,对应于手册页部分。
手册页部分 | |
---|---|
第 1 部分 | 有关可执行文件的信息 |
第 2 部分 | 系统调用,例如 mkdir(2) |
第 3 部分 | 库调用,例如 stdio(3) |
第 4 部分 | 设备(/dev 中的文件) |
第 5 部分 | 配置文件和格式 |
第 6 部分 | 游戏 |
第 7 部分 | 宏包 |
第 8 部分 | 管理命令 |
第 9 部分 | 内核例程 |
有时,具有相同名称的手册页存在于多个部分中。
要访问特定部分N,必须输入
man N command
示例
[[Image:]] $ man mkdir $ man 2 mkdir |
---|
$ man crontab $ man 5 crontab |
file
file 用于尝试检测特定文件的类型。
例如
$ file picture.png picture.png: PNG image, 179 x 179, 8-bit/color RGBA, non-interlaced |
该实用程序将识别命名不正确的文件,因此,如果 picture.png 被命名为 readme.txt,则命令“file readme.txt”仍将识别该文件为 png 文件。
uname
uname 命令打印与内核版本、机器名称、处理器类型和节点名称相关的信息。它最常用于识别机器运行的内核版本。
$ uname -r |
打印当前运行内核的版本号。
pwd
这是一个简单地打印 shell 的当前工作目录的命令。
使用的文件、术语和实用程序:* bash
- echo
- env
- exec
- export
- pwd
- set
- unset
- man
- uname
- history