跳转到内容

Ict-创新/LPI/103.1

来自 Wikibooks,开放书籍,开放世界

103.1 命令行工作

[编辑 | 编辑源代码]

考生应该能够使用命令行与 Shell 和命令交互。目标假设使用 bash Shell。


关键知识领域

  • 使用单个 Shell 命令和单行命令序列在命令行上执行基本任务。
  • 使用和修改 Shell 环境,包括定义、引用和导出环境变量。
  • 使用和编辑命令历史。
  • 在定义的路径内外调用命令。

与计算机系统交互的基本方法是使用命令行。Shell 解释在键盘上输入的指令。Shell 提示符(以 $ 或 # 结尾,表示用户 root)表示它已准备好接收用户输入。

Shell 也是一个编程环境,可用于执行自动化任务。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

[编辑 | 编辑源代码]

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 变量

[编辑 | 编辑源代码]

Shell 变量类似于任何计算语言中使用的变量。变量名仅限于字母数字字符。例如 CREDIT=300 只是将值 300 分配给名为 CREDIT 的变量。

1. 初始化变量 Variable-Name=value(没有空格!!)
2. 引用变量 $Variable-Name


CREDIT=300

echo $CREDIT

可以使用 unset 命令删除变量的值。


导出、设置和 Env

变量有两种类型:局部变量和导出变量。

局部变量仅对当前 Shell 可访问。另一方面,导出变量可供 Shell 和从该 Shell 启动的任何子进程访问。

setenv 命令用于列出定义的变量

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

  1. ls
  2. grep 500 /etc/passwd

这列出了所有缓存的命令,以及保存在 ~/.bash_history 中的命令。当用户退出 Shell 时,缓存的命令将保存到 ~/.bash_history

您可以使用键盘上的向上箭头和向下箭头来回忆命令。还有 emacs 键绑定,使您能够执行甚至编辑这些行。

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


$ bash

$ echo $$

455


$ echo hello

hello

$ echo $$

455


$ exec echo hello

hello

$ echo $$

414

上面的示例显示了在直接的 echo 和使用 exec 的第一个 shell(进程 414)之后,控制返回到第二个 shell(进程 455)。

手册页和 whatis 数据库

[edit | edit source]
手册页按特定主题组织
NAME 项目的名称,后跟简短的一行描述。
SYNOPSYS 命令的语法
DESCRIPTION 更详细的描述
OPTIONS 所有可能的选项及其功能的概述
FILES 与当前项目相关的文件(配置文件等)
SEE ALSO 与当前主题相关的其他手册页

这些是手册页中可以预期找到的主要主题部分。

whatis 数据库存储系统上所有手册页的 NAME 部分。它通过每天的 cron 定期更新。whatis 数据库具有以下两个条目

name(key) – 一行描述

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


上一章 | 下一章

华夏公益教科书