第 二 部 分 Linux 操 作

第 5 章 Shell 操 作

Shell 是 一 种 命 令 解 释 器 , 它 提 供 了 一 个 面 向 行 (line-Oriented )的 用 户 和 操 作系 统 间 的 交 互 式 界 面 ,你 在 命 令 行 中 输 入 命 令 ,它 们 被 成 指 令 送 往 操 作 系 统 。Shell 这 一 能 力 提 供 了 许 多 高 级 的 特 征 。 例 如 ,Shell 有 一 套 特 殊 的 字 符 集 可 以 产 生 文件 名 , 它 可 能 重 定 向 输 入 和 输 出 , 它 也 可 以 在 后 台 运 行 操 作 , 使 你 用 来 完 成 其 它 任务 。

人 们 为 Linux 开 发 了 三 种 不 同 的 Shell 它 们 分 别 是 :the Bourne Again shell(BASH), 公 众 域 Korn Shell (PDKSH ) 和 TCSH Shell 。 你 可 以 利 用 所 有 这 三种 Shell, 尽 管 BASH 是 使 用 较 少 的 , 本 书 中 都 使 用 了 BASH Shell 。 你 只 需 要 一种 SHELL 即 可 完 成 你 的 工 作 。 这 一 章 讨 论 了 所 有 的 Shell 的 共 同 特 征 ,而 15 和16 章 讨 论 了 BASH,PDKSH 和 TCSH 的 不 同 之 处 ,你 可 以 看 到 如 何 设 置 SHELL 来 使 用 别 名 (aliases) 历 史 事 件 和 系 统 变 量 。 这 些 SHELL 甚 至 有 自 己 编 程 语 言 。

这 一 章 主 要 讲 述 命 令 执 行 的 共 同 特 征 ; 尤 其 是 ,命 令 行 编 辑 , 特 珠 字 符 、 重 定 向 、管 道 、 变 量 、 scripts 和 作 业 控 制 。

命 令 行

当 你 登 录 到 linux 时 , 你 可 以 看 到 一 个 命 令 界 面 。 它 是 一 条 线 ,在 这 里 你 可 以输 入 带 着 操 作 和 参 数 的 任 何 命 令 , 一 个 Shell 提 示 符 . 如 下 所 未 , 标 识 了 命 令 行 的开 始 。

Linux 安 装 了 Bourne Again Shell 通 常 叫 作 BASH Shell 。 BASH shell 有一 个 美 元 提 示 符 ;但 Linux 有 其 它 几 种 Shell, 每 一 种 Shell 都 有 自 己 的 提 示 符 。 不同 的 几 种 Shell 将 在 第 15 章 讨 论 。

当 系 统 提 示 符 出 现 时 ,你 已 登 寻 到 系 统 中 ,提 示 符 标 识 了 命 令 行 的 开 始 ,你 现 在可 以 准 备 输 入 命 令 和 它 的 参 数 了 。

在 下 一 个 例 子 中 ,用 户 输 入 了 date 命 令 , 它 可 以 显 示 日 期 。 用 户 在 第 一 行 输入 了 命 令 ,然 后 按 Enter 执 行 命 令 。

$ date

Sun July 7 10:30:21 PST 1996

当 你 登 录 时 , 你 实 际 进 入 了 Shell, 它 将 你 输 入 的 命 令 加 以 翻 译 并 传 递 给 系统 ,Shell 遵 循 一 定 的 语 法 对 命 令 进 行 翻 译 ,命 令 行 中 输 入 的 第 一 个 字 必 行 是 一 个命 令 的 名 字 ,第 二 个 字 是 命 令 的 选 项 和 参 数 , 命 令 行 中 的 每 个 字 必 须 由 空 格 或 tab

来 隔 开

$ Command Options Arguments.

当 你 输 入 一 人 Linux 命 令 时 ,Shell 首 先 读 入 这 一 命 令 的 名 字 ,然 后 核 实 是 否确 实 存 在 此 名 字 的 命 令 。 如 果 没 有 这 一 命 令 ,Shell 会 显 示 一 条 出 错 的 信 息 。

选 项 和 参 数

选 项 是 一 个 只 有 一 个 字 母 的 代 码 ,它 前 面 有 一 横 线 ,选 项 可 用 于 改 变 命 令 执 行的 动 作 的 类 型 。 有 选 项 的 命 令 的 例 子 是 ls 命 令 。 没 有 选 项 的 ls 命 令 列 出 了 你 当前 目 录 中 所 有 文 件 的 列 表 。 它 只 列 出 各 个 文 件 的 名 字 。 而 不 显 示 其 它 更 多 的 信息 。

加 入 -l 项 ,ls 命 令 将 改 变 它 的 任 务 , 它 会 为 每 个 文 件 列 出 一 行 信 息 ,诸 如 数 据 大小 和 数 据 最 后 被 修 改 的 时 间 。 在 下 一 个 例 子 中 ,用 户 使 用 了 带 -L 选 项 的 ls 命 令 ,-l 项 之 前 的 横 线 是 必 要 的 ,Linux 用 它 来 区 别 选 项 和 参 数 。

$ ls -l

另 一 个 选 项 -a ,可 以 列 出 目 录 中 所 有 的 文 件 ,包 括 一 些 被 隐 藏 的 文 件 ,隐 藏 文 件通 常 是 配 置 文 件 ,文 件 名 以 点 号 开 头 。 正 因 为 这 个 原 因 ,这 些 原 因 这 些 文 件 被 称 作点 文 件 (dotfiles) 。 在 大 部 分 情 况 下 , 你 可 以 使 用 组 合 选 项 。 你 应 在 选 项 之 前 加 一起 始 横 线 。 然 后 列 出 你 想 要 的 选 基 本 项 。 例 如 : 选 项 -al, 会 列 出 你 目 录 中 所 有 文件 的 信 息 ,包 括 任 何 的 隐 藏 文 件 。

$ ls -al

ls 命 令 的 另 一 选 项 是 -F 。 利 用 这 一 选 项 ,ls 命 令 可 以 用 于 前 面 带 斜 杠 的 形 式

显 示 目 录 名 ,这 样 你 便 可 以 轻 松 地 加 以 识 别 。

大 多 数 命 令 都 被 设 计 为 可 以 接 纳 参 数 。 参 数 是 你 在 命 令 行 中 的 选 项 之 后 键入 的 一 个 词 。 许 多 文 件 管 理 命 令 把 文 件 名 作 为 参 数 。 例 如 , 如 果 你 只 想 显 示 某 一特 定 文 件 的 信 息 ,你 可 以 把 此 文 件 的 名 字 加 在 -L 选 项 之 后 。

$ ls -l mydata

你 可 以 输 入 参 数 ,也 可 以 不 用 输 入 , 取 决 于 不 同 命 令 。 一 些 命 令 , 例 如 ls, 不 需要 任 何 参 数 。 另 一 些 命 令 可 能 需 要 一 些 最 小 数 目 的 参 数 。 例 如 ,cp 命 令 至 少 需 要两 个 参 数 ,如 果 参 数 的 数 目 与 命 令 所 要 求 的 不 符 ,Shell 将 给 出 出 错 信 息 。

记 住 在 命 令 行 中 选 项 先 于 参 数 输 入 。 以 cp 命 令 为 例 , 用 于 检 查 覆 盖 状 况(overwrite condition ) 的 选 项 -i 先 于 文 件 名 参 数 键 入 。 以 下 是 一 些 输 入 命 令 的 例子 :

$ ls 无 选 项 命 令

$ ls -F 带 选 项 命 令

$ cp -i mydata newdata 带 选 项 和 参 数 的 命 令

命 令 行 特 征

命 令 行 实 际 上 是 你 可 以 编 辑 的 一 个 文 本 缓 冲 区 。 在 按 回 车 之 前 , 你 可 以 在 输入 时 的 文 本 上 进 行 编 辑 。 编 辑 的 功 能 是 有 限 的 ,但 它 的 确 提 供 了 一 个 改 正 错 误 的方 法 。 BACK SPACE 和 DEL 键 允 许 你 删 除 刚 刚 敲 入 的 字 符 。 利 用 这 种 字 符 删除 的 功 能 , 你 可 以 整 行 删 除 , 并 让 你 所 输 入 的 东 西 , 只 要 你 愿 意 。 CTRL-D 组 合 键可 以 整 行 删 除 , 并 让 你 从 提 示 符 重 新 开 始 , 下 一 个 例 子 中 , 用 户 键 入 了 datl 而 不 是

date 。 利 用 BACKSPACE ,用 户 删 除 了 1, 然 后 输 入 了 e 。

$ datl

$ dat

$ date

你 将 在 其 中 进 行 工 作 的 Shell 是 BASH Shell, 你 缺 省 的 Shell, 这 一 Shell 具有 特 别 的 命 令 行 编 辑 能 力 ,这 一 功 能 在 你 学 习 Linux 时 会 非 常 有 用 。 你 可 以 在 执行 之 前 对 命 令 任 意 修 改 ,也 可 以 在 命 令 行 上 任 意 移 动 并 插 入 或 删 除 字 符 。 这 时 复杂 命 令 尤 其 必 要 。 你 可 以 用 CTRL-D 或 DEL 删 除 光 标 所 在 位 置 的 字 符 。 如 要加 入 文 本 , 只 需 将 光 标 移 动 到 需 要 加 入 字 符 的 地 方 ,然 后 键 入 字 符 即 可 。 你 在 任 何时 候 都 可 以 按 ENTER 键 来 执 行 命 令 。 例 如 , 如 果 在 输 入 命 令 时 ,你 犯 了 一 个 拼 写错 误 ,无 须 重 新 输 入 整 个 命 令 ,你 只 要 利 用 编 辑 操 作 即 可 发 改 正 这 一 错 误 。

你 也 可 以 利 用 上 箭 头 来 重 新 显 示 你 刚 执 行 的 命 令 。 然 后 你 可 以 重 新 执 行 这一 命 令 , 也 可 以 对 之 修 改 ,执 行 修 改 后 的 命 令 。 当 你 进 行 一 些 重 复 性 的 工 作 , 例 如编 辑 同 一 个 文 件 时 ,你 会 发 现 这 一 个 功 能 是 非 常 有 用 的 。 当 你 执 行 了 一 个 你 键 入不 正 确 的 命 令 时 这 一 功 能 也 非 常 有 用 的 。 在 这 种 情 况 下 , 会 显 示 一 条 了 出 错 信 息和 一 个 空 的 命 令 行 ,按 上 箭 头 后 便 可 重 新 显 示 刚 才 执 行 的 命 令 , 将 之 改 正 并 重 新 执行 。 这 样 ,你 就 无 需 再 重 新 敲 入 整 个 命 令 了 。 BASH shell 保 存 着 你 以 前 敲 过 的 命令 的 列 表 , 这 一 列 表 被 称 作 历 史 列 表 (history list) 。 按 动 上 箭 头 ,你 便 可 以 在 命 令行 上 逐 次 显 示 各 条 命 令 。 下 箭 头 使 你 在 列 表 中 向 下 移 动 。 当 你 将 以 前 的 这 些 命令 显 示 在 命 令 行 上 时 ,你 就 可 以 修 改 并 执 行 这 些 命 令 。 这 一 特 征 将 在 第 15 章 进行 详 细 的 讨 论 。

一 些 命 令 可 能 很 复 杂 , 需 要 比 较 长 的 时 间 来 执 行 。 当 你 执 行 了 错 误 的 命 令 时 ,

你 可 以 中 断 并 中 止 这 些 命 令 的 执 行 ,只 要 利 用 中 断 键 -CTRL_C 或 DE L 。

你 可 以 在 一 个 命 令 行 中 置 入 多 个 命 令 , 或 者 你 也 可 以 用 几 行 来 输 入 一 个 命令 。 如 果 要 在 一 行 中 输 入 多 个 命 令 , 用 分 号 将 命 令 隔 开 。 下 一 个 例 子 说 明 了 如 何在 一 个 命 令 行 中 输 入 ls 和 cp 命 令 。

$ ls-F ; cp -T mydata newdata

在 按 回 车 键 之 前 加 入 一 个 反 斜 杠 ,你 便 可 以 在 几 个 命 令 行 中 输 入 一 个 命 令 。反 斜 杠 可 以 有 效 地 将 一 个 命 令 行 持 续 到 另 一 行 。 在 下 一 个 例 子 中 ,cp 命 令 是 在 三行 中 输 入 的 。 开 始 的 两 行 以 反 斜 杠 告 终 , 有 效 地 使 三 行 保 持 一 个 命 令 行 。

$ cp -i \ my data \ newdata

特 殊 字 符 和 文 件 名 参 数 :* ,?,[ ]

文 件 名 是 参 数 命 令 中 最 常 见 的 参 数 。 你 通 常 只 知 道 文 件 名 的 一 部 分 ,或 者 你想 参 看 几 个 有 相 同 扩 展 名 的 不 同 文 件 , 或 者 以 相 同 字 符 开 头 的 文 件 。 Shell 提 供了 一 套 特 殊 字 符 来 查 找 , 匹 配 并 产 生 文 件 名 的 列 表 。 这 些 特 殊 的 字 符 是 星 号 ,问 号和 中 括 号 (* ,? ,[ ])。 给 出 一 个 部 分 文 件 名 ,Shell 用 找 到 的 匹 配 操 作 来 查 找 文 件 并产 生 文 件 的 一 个 列 表 。 Shell 用 找 到 的 匹 配 文 件 列 不 来 代 替 部 分 文 件 名 变 量 。 这些 文 件 名 更 可 以 成 为 那 些 操 作 文 件 的 命 令 ,如 ls 。表 5-1 (在 本 章 最 后 ) 列 出 了 shell 的 特 殊 字 符 。

你 可 以 利 用 星 号 ,*, 来 查 找 以 特 定 字 符 集 开 头 或 结 尾 的 文 件 。 你 可 将 星 号 置于 字 符 集 的 开 头 或 结 尾 以 形 成 进 行 文 件 名 查 找 的 格 式 。 如 果 星 号 置 于 字 符 集前 ,shell 会 查 找 以 字 符 集 结 尾 的 文 件 。 如 果 星 号 置 后 ,则 会 查 找 以 字 符 集 开 头 的文 件 。 任 一 匹 配 的 文 件 名 都 会 被 拷 贝 入 此 操 作 产 生 的 一 个 文 件 列 表 中 。 在 下 一个 例 子 中 ,所 有 以 ” doc ” 开 头 的 文 件 都 会 被 查 找 并 产 生 一 个 列 表 。然 后 所 有 以 ” da y” 结 尾 的 文 件 也 会 被 查 找 并 产 生 一 个 列 表 。

$ ls

doc1 doc2 document docs mydoc monday tuesday

$ ls *day monday tuesday

$

文 件 名 常 常 包 括 一 个 扩 展 名 ,它 由 句 号 标 识 , 同 一 个 单 字 符 构 成 。 扩 展 名 没 有特 殊 的 地 位 , 它 只 是 构 成 文 件 名 的 字 符 的 一 部 分 。 使 用 星 号 使 选 择 带 扩 展 的 文 件变 得 很 容 易 。 在 下 一 个 例 子 中 , 星 号 用 来 显 示 那 些 具 有 .C 扩 展 的 文 件 。 .C 前 的星 号 构 成 了 ls 的 参 数 。

$ ls * .C calc.c main.c

你 也 可 以 使 用 特 殊 字 符 ,* ,与 rm 命 令 一 起 同 时 删 除 几 个 文 件 。 星 号 首 先 选 择具 有 特 定 扩 展 的 一 个 文 件 列 表 ,或 者 以 给 定 字 符 集 开 头 或 结 尾 的 文 件 列 表 ,然 后 将此 文 件 列 表 提 交 rm 命 令 来 进 行 删 除 。 在 下 一 例 子 中 ,rm 命 令 删 除 了 所 有 以 ” doc ” 开 头 的 文 件 。

$ rm doc*

星 号 本 身 会 匹 配 所 有 的 文 件 。 如 果 你 只 用 一 个 星 号 作 为 rm 命 令 的 参 数 , 那么 所 有 的 文 件 都 会 删 除 。 下 一 例 子 中 ,ls* 命 令 列 出 了 所 有 文 件 ,rm * 命 令 则 删 除 了所 有 文 件 。

$ ls *

doc1 doc2 document docs mydoc , myletter your letter

$ rm *

$ ls

你 应 小 心 使 用 星 号 ,尤 其 使 用 rm 命 令 时 ,这 一 组 合 可 能 是 非 常 危 险 的 。 在 没有 一 选 项 的 rm 命 令 中 错 误 放 置 的 星 号 可 能 会 删 除 的 你 所 有 文 件 。 下 一 例 子 中第 一 个 命 令 只 删 除 了 那 些 具 有 .C 扩 展 的 文 件 。 而 第 二 命 令 删 除 了 所 有 的 文 件 。注 意 第 二 个 命 令 中 星 号 与 句 号 之 间 的 空 格 。 在 命 令 行 中 空 格 的 作 用 是 一 个 定 界符 ,用 于 分 隔 参 数 。 星 号 被 认 为 是 一 个 参 数 与 rm 命 令 一 起 使 用 时 ,会 指 示 rm 删除 所 有 的 文 件 。

$ rm *.C

$ rm * .C

问 号 ? 只 匹 配 文 件 名 中 一 个 单 一 的 不 完 整 字 符 。假 设 你 想 匹 配 doc1 和 docA, 而 没 有 document 。 星 号 会 匹 配 所 有 长 度 的 文 件 名 ,而 问 号 会 将 匹 配 限 制 于 一 个字 符 。 下 一 例 子 匹 配 了 以 ” doc ” 开 头 ,后 面 只 有 一 个 不 同 字 符 的 文 件 。

$ ls

doc1 docA document

$ ls doc?

doc1 docA

如 果 你 愿 意 , 你 可 以 使 用 多 个 问 号 , 你 也 可 以 把 问 号 放 在 文 件 搜 索 样 式 的 任 一地 方 ,下 一 例 子 寻 找 一 个 可 能 有 三 个 不 同 字 符 的 文 件 样 式 。

$ ls ?y?oc?

mydocs mylock sydoc1

你 可 以 将 ? 和 其 它 的 特 殊 字 符 组 合 来 创 建 一 些 非 常 强 大 的 匹 配 操 作 ,假 设 你想 查 找 只 有 一 个 字 符 扩 展 的 所 有 文 件 。 你 可 以 使 用 星 号 来 做 文 件 名 的 正 确 匹 配 , 使 用 ? 来 做 单 字 符 扩 展 的 匹 配 ,:* 、 ? 。 下 一 例 子 中 , 用 户 显 示 了 所 有 只 有 一 个扩 展 字 符 的 所 有 文 件 。

$ ls *.? clac.c lib.a

星 号 和 问 号 标 识 的 是 文 件 名 中 不 完 整 的 部 分 , 而 中 括 号 [], 允 许 你 查 找 一 套 有

效 的 字 符 。放 在 中 括 号 中 的 任 何 字 符 都 要 与 文 件 名 相 匹 配 。假 设 你 想 列 出 以 ” doc ” 开 头 , 而 以 “ L ” 或 ” A ” 结 尾 的 所 有 文 件 , 你 对 以 ”I ” 、 ” B ” 其 它 字 符 结 尾 的 文 件 不 感 兴趣 。 下 面 即 是 如 何 来 完 成 这 一 要 求 的 方 法 :

$ ls

doc1 doc2 doc3 docA docB docD document

$ ls doc [1A] doc1 docA

你 也 可 以 列 出 一 个 字 符 集 的 范 围 ,而 不 是 将 之 逐 一 列 出 。 在 上 限 和 一 限 字 符之 间 的 横 线 将 选 择 此 范 围 内 的 所 有 字 符 。 这 一 范 围 通 常 由 所 使 用 的 字 符 集 来 决定 。 在 ASCII 码 字 符 集 中 ,a-g 这 一 范 围 将 选 择 包 括 a,g 在 内 的 a-g 间 的 所 有 字

符 。 下 一 例 子 中 , 以 ” doc ” 开 头 并 以 ” 1-3 ” 之 间 的 字 符 结 束 的 文 件 将 被 选 取 。 然 后以 B-E 间 字 符 结 否 的 文 件 将 匹 配 。

$ ls doc[1-3 ] doc1 doc2 doc3

$ ls doc[B-E] docB docD

你 可 将 中 括 号 与 其 它 特 殊 字 符 组 合 在 一 起 产 生 非 常 灵 活 的 匹 配 操 作 符 。 假设 你 只 想 列 出 以 .C 或 O 作 扩 展 的 文 件 。

$ ls * .[co]

main.c main.o calc.c

可 能 有 时 候 特 殊 字 符 是 文 件 名 的 一 部 分 。 在 这 种 情 况 下 , 你 需 要 在 前 面 加 一反 斜 杠 来 引 用 这 一 特 殊 字 符 来 进 行 文 件 查 找 。 在 下 一 例 子 中 , 用 户 要 查 找 一 人以 ? 结 尾 的 文 件 ,answer? 。 然 而 ? 是 一 人 特 殊 字 符 它 会 匹 配 所 有 以 ” answe r” 开头 并 另 有 一 人 或 多 个 字 符 的 文 件 。 在 这 种 情 况 下 , 用 户 在 ”? ” 号 前 加 一 反 斜 杠 来qwote 该 字 符 以 查 找 文 件 。

$ ls answers\? answers?

你 可 以 将 一 个 被 引 用 的 字 符 与 特 殊 字 符 在 文 件 名 中 相 组 合 。 在 下 一 个 例 子中 ,用 户 列 出 所 有 以 ”answer? ” 开 头 并 有 扩 展 的 文 件 。

$ ls answers\?. *

answers?.quiz answers?.mid answers? .final

标 准 输 入 / 输 入 和 重 定 向

当 设 计 UNIX 系 统 时 ,文 件 的 逻 辑 结 构 和 物 理 结 构 是 有 区 别 的 。 物 理 上 ,文 件以 随 机 的 块 存 放 。 逻 辑 上 ,文 件 是 持 续 的 byte 流 。 作 为 UN IX 的 一 个 版 本 ,Linux 也 具 有 相 同 的 组 织 形 式 。 除 了 一 些 特 别 的 系 统 调 用 ,用 户 无 须 参 照 ,文 件 的 物 理 结构 。 对 用 户 而 言 ,所 有 文 件 具 有 单 一 的 形 式 -byte 流 。 任 何 一 个 文 件 都 可 以 轻 易地 拷 贝 或 添 加 入 另 一 个 文 件 , 因 为 所 有 文 件 都 具 有 相 同 的 组 织 形 式 。 在 这 种 意 义上 讲 ,Linux 中 只 有 一 种 文 件 的 标 准 ,即 byte 流 文 件 。 Linux 对 字 符 文 件 或 记 录 文件 ,文 本 文 件 或 二 进 制 文 件 不 作 区 别 。

这 一 逻 辑 文 件 组 织 形 式 延 伸 到 输 入 和 输 出 操 作 。 输 入 和 输 出 操 作 中 的 数 据像 文 件 一 样 进 行 组 织 。 键 盘 输 入 的 数 据 被 置 入 为 持 续 byte 集 的 数 据 流 中 。 命 令或 程 序 的 输 出 也 被 置 入 数 据 流 中 , 并 被 设 为 持 续 的 byte 集 。 这 种 输 入 数 据 流 在Linux 中 被 称 为 标 准 输 入 ,而 输 出 数 据 流 被 称 作 标 准 输 出 。

因 为 标 准 输 入 和 标 准 输 出 与 文 件 具 有 相 同 的 组 织 形 式 ,它 们 可 以 很 容 易 地 与文 件 相 互 作 用 。 Linux 有 一 种 重 定 向 能 力 ,利 用 它 你 可 轻 易 地 将 数 据 移 入 和 移 出文 件 。 你 可 以 将 输 出 重 定 向 ,使 之 不 在 屏 幕 上 显 示 ,而 是 存 到 一 个 文 件 中 。 你 也 可以 将 标 准 输 入 重 定 向 ,使 之 从 键 盘 移 至 一 个 文 件 ,那 么 输 入 就 会 对 文 件 进 行 读 取 而不 是 对 键 盘 。

第 二 部 分 Linux 操 作 - 图1

图 5-1 标准输出 , 标准输入和 shell

当 Linux 命 令 被 执 行 并 产 生 输 出 时 ,这 一 输 出 被 置 于 标 准 输 出 数 据 流 中 。 标准 输 出 数 据 流 的 缺 省 目 的 地 是 一 个 设 备 , 在 这 种 情 况 下 , 是 屏 幕 设 备 , 诸 如 键 盘 和屏 幕 ,被 当 作 文 件 对 待 ,它 们 的 组 织 形 式 接 收 、 发 送 byte 流 , 正 如 同 那 些 byte 流 文

件 。 屏 幕 是 一 种 显 示 持 续 byte 流 的 设 备 , 缺 省 情 况 下 , 标 准 输 出 将 把 数 据 送 到 屏幕 设 备 , 屏 幕 将 数 据 显 示 出 来 。 例 如 ,ls 命 令 产 生 所 有 文 件 名 的 一 个 列 表 , 并 将 之输 出 到 标 准 输 出 。 在 标 准 输 出 中 的 这 一 byte 流 被 导 向 屏 幕 设 备 。 然 后 文 件 名 列表 被 显 示 在 屏 幕 上 。 cat 命 令 也 将 输 出 结 果 送 往 标 准 输 出 。 文 件 的 内 容 被 拷 贝到 标 准 输 出 中 , 而 一 标 准 输 出 缺 省 的 目 的 地 是 屏 幕 。 然 后 文 件 的 内 容 便 在 屏 幕 上显 示 出 来 。 图 5-1 说 明 了 标 准 输 入 与 键 盘 ,标 准 输 出 和 屏 幕 设 备 的 相 互 关 系 。

重 定 向 标 准 输 出 :> 和 >>

假 如 你 不 想 在 屏 幕 上 显 示 一 个 文 件 列 表 ,而 想 把 列 表 存 入 一 个 文 件 。 换 言 之 , 你 想 将 标 准 输 出 指 向 一 个 文 件 而 不 是 显 示 屏 幕 。 要 做 到 这 一 点 ,你 应 在 命 令 行 中Linux 命 令 之 后 加 入 一 个 输 出 重 定 向 符 > (大 于 号 ) 和 一 个 文 件 的 名 字 。 表 5-2 (在本 章 最 后 提 到 ) 列 出 了 重 定 向 符 的 不 同 使 用 方 法 。 在 下 一 个 例 子 中 ,cat 命 令 的 输出 被 由 显 示 设 备 重 定 向 到 了 一 个 文 件 。 正 如 图 5-2 所 示 ,mylette 文 件 的 内 容 并未 在 屏 幕 上 显 示 ,它 被 重 定 向 到 文 件 mewletter 当 中 去 了 。

$ cat myletter >newlette2

重 定 向 操 作 创 建 了 新 的 目 的 文 件 。 如 果 这 一 文 件 已 经 存 在 , 它 将 被 标 准 输 出中 的 数 据 所 覆 盖 。 你 可 以 对 noclobber 特 征 进 行 设 置 ,以 防 止 在 重 定 向 操 作 中 对已 有 文 件 进 行 覆 盖 。 在 这 种 情 况 下 , 对 已 有 文 件 的 重 定 向 操 作 将 会 失 败 。 你 可 以在 重 定 向 操 作 符 后 加 一 个 惊 叹 号 来 强 行 忽 略 noclobber 属 性 。 下 一 例 子 设 置 了BASH shell 的 noclobbe 属性 ,然 后 对 oldletter 文 件 强 行 写 入 , 假 如 这 一 文 件 已 经存 在 的 话 ( 图 5-2 )。

$ set -o noclobber

第 二 部 分 Linux 操 作 - 图2$ cat mylette>! obllete

重 定 向 文 件 的 创 建

图 5-2 标准输出重定向到一个文件

尽 管 重 定 向 操 作 符 和 文 件 名 都 被 放 在 命 令 之 后 ,重 定 向 并 不 是 在 命 令 之 后 执行 。 实 际 上 ,它 是 在 命 令 执 行 之 前 执 行 ,重 定 向 操 作 创 建 了 该 文 件 并 在 它 从 标 准 输出 接 收 数 据 之 前 设 置 重 定 向 。 如 果 这 一 文 件 已 经 存 在 , 它 将 会 被 破 坏 并 不 被 同 名

的 文 件 所 代 替 。 实 际 上 ,产 生 输 出 结 果 的 这 一 命 令 只 有 在 重 定 向 文 件 创 建 之 后 才被 执 行 。

在 下 一 个 例 子 中 ,ls 命 令 的 输 出 被 由 显 示 设 备 重 定 向 到 一 个 文 件 中 。 首 先 ,ls 命 令 作 文 件 列 表 ,在 第 二 个 命 令 中 ,ls 命 令 将 文 件 列 表 重 定 向 到 listf 文 件 中 。 然 后cat 命 令 显 示 了 存 在 listf 文 件 中 的 文 件 列 表 。 注 意 listf 中 的 文 件 列 表 包 括 listf 的名 字 。 由 ls 命 令 产 生 的 文 件 列 表 将 会 包 括 由 重 定 向 操 作 创 建 的 文 件 的 文 件 名 ,在这 一 例 子 中 ,即 listf 。 listf 文 件 首 先 由 重 定 向 操 作 所 创 建 , 然后 ls 命 令 将 与 其 它 文件 一 起 进 行 列 表 。 然 后 ls 的 文 件 列 表 输 出 被 重 定 向 到 listf 文 件 中 ,而 不 是 在 显示 设 备 上 输 出 。

$ ls

mydate intro preface

$ ls> listf

$ cat listf

mydata intro listf preface

当 你 试 图 将 同 一 个 文 件 作 为 命 令 的 输 入 文 件 和 重 定 向 的 目 的 文 件 时 ,会 有 错误 发 生 。 在 这 种 情 况 下 , 因 为 重 定 操 作 是 先 执 行 的 , 因 为 输 入 文 件 是 已 存 在 的 , 它会 存 坏 并 被 同 名 的 文 件 所 代 替 。 当 命 令 执 行 时 ,它 就 会 发 现 输 入 文 件 是 空 的 。

在 下 面 介 绍 的 cat 命 令 中 ,文 件 myletter 既 是 重 定 向 输 出 的 目 的 文 件 名 ,又 是cat 命 令 的 输 入 文 件 名 。 正 如 下 一 个 例 子 所 示 ,重 定 向 操 作 首 先 执 行 , 将 myletter 文 件 破 坏 ,然 后 用 一 个 同 名 的 myletter 文 件 替 换 它 。 然 后 再 cat 命 令 并 试 图 读 入my letter 文 件 中 所 有 的 数 据 。 然 而 ,现 在 在 myletter 文 件 中 已 经 什 么 都 没 有 的 。

$ cat mylettaer>myletter

添 加 标 准 输 出 :>>

你 也 可 以 利 用 重 定 向 操 作 符 将 标 准 输 出 添 加 到 一 个 现 存 的 文 件 中 去 。 标 准输 出 中 的 数 据 被 添 加 到 文 件 的 末 尾 ,而 并 不 会 覆 盖 这 一 文 件 。 在 下 一 个 例 子 中 , 文件 myletter 和 oldletter 天 加 到 alletters 中 去 。 alletters 文 件 将 会 包 含 mylteler 和 oldletter 文 件 的 内 容 。

$ cat myletter >>alletters

$ cat oldletter >>alletters

标 准 输 入

许 多 linux 命 令 可 以 标 准 输 入 中 接 收 数 据 。 标 准 输 入 本 身 从 一 个 设 备 或 文 件中 接 收 数 据 。 标 准 输 入 的 缺 省 设 备 是 键 盘 。 键 盘 上 敲 入 的 字 符 置 于 标 准 输 入 中 , 然 后 再 被 导 向 Linux 命 令 。

cat 命 令 如 果 没 有 文 件 参 数 , 它 将 会 从 标 准 输 入 中 读 入 数 据 。 当 你 在 键 盘 上敲 入 数 据 时 ,每 一 个 字 符 都 会 被 置 在 标 准 输 入 中 ,然 后 被 导 向 cat 命 令 。 cat 命 令会 将 这 些 字 符 送 往 标 准 输 出 — — 显 示 设 备 — — 它 会 将 字 符 在 屏 幕 上 显 示 出 来 。

当 你 做 上 述 工 作 时 , 你 会 发 现 当 你 敲 入 一 行 , 这 一 行 会 迅 速 在 屏 幕 上 显 示 出来 。 这 都 归 功 于 在 许 多 Linux 系 统 中 采 用 的 行 缓 冲 方 法 。 行 缓 冲 (Line buffering) 要 求 用 户 键 入 整 个 行 , 然 后 输 入 才 会 被 送 往 标 准 输 入 。 cat 命 令 每 次 从 标 准 输 入获 得 一 整 行 ,然 后 它 会 将 之 迅 速 在 屏 幕 上 显 示 。 在 下 一 个 例 子 中 , 用 户 执 行 了 cat 命 令 而 未 加 任 何 参 数 。 当 用 户 输 入 一 整 行 ,它 被 送 往 标 准 输 入 ,cat 命 令 将 之 从 标准 输 入 中 读 出 ,并 送 到 标 准 输 出 。

$ cat

This is a new line. This is a new line for the cat

for the cat

command command

^D

$

cat 命 令 将 会 持 续 执 行 下 去 , 直 到 一 个 CTRL-D 字 符 在 一 行 中 输 入 。 CTRL-D 是 任 何 Linux 文 件 的 结 束 字 符 。 在 某 种 意 义 上 ,用 户 是 在 键 盘 上 创 建 一 个 文 件 ,并用 文 件 结 束 字 符 来 结 束 文 件 。 记 住 , 标 准 输 入 , 同 标 准 输 出 一 样 , 有 着 与 Linux 文件 相 同 的 格 式 。 如 果 你 将 cat 命 令 与 重 定 向 结 合 起 来 ,你 就 有 一 种 简 易 的 为 存 储你 敲 入 一 个 文 件 的 数 据 。正 如 下 一 个 例 子 所 示 ,cat 操 作 的 输 出 被 重 定 向 到 mydat 文 件 中 。 mydat 文 件 中 将 存 在 所 有 从 键 盘 敲 入 的 数 据 。 cat 命 令 在 这 种 情 况 下仍 然 没 有 文 件 参 数 。 它 将 从 标 准 输 入 - 键 盘 设 备 — — 中 接 收 数 据 。 重 定 向 操 作 符将 cat 命 令 的 输 出 重 定 向 到 mydat 文 件 ,cat 命 令 与 任 何 文 件 之 间 并 没 有 直 接 的关 系 。 它 只 是 从 标 准 输 入 中 接 收 数 据 ,然 后 将 输 出 送 往 标 准 输 出 。

$ cat >mydat This is a new line for the cat command

^D

$

标 准 输 入 的 重 定 向 :<

如 同 标 准 输 出 一 样 , 你 也 可 以 对 标 准 输 入 重 定 向 。 标 准 输 入 可 从 一 个 文 件 获得 而 不 是 键 盘 。 对 标 准 输 入 重 定 向 的 操 作 符 是 小 于 号 < 。 在 下 一 个 例 子 中 , 标 准输 入 被 重 定 向 为 从 文 件 my lettev 而 不 是 从 键 盘 中 获 得 输 入 。 mylertter 文 件 中 的内 容 被 重 定 向 操 作 读 入 标 准 输 入 。 然 后 cat 命 令 读 入 标 准 输 入 并 在 屏 幕 上 显 示my letter 的 内 容 。

$ cat < myletter hello Christopher How are you today

$

你 可 将 对 标 准 输 入 和 标 准 输 出 的 重 定 向 结 合 起 来 , 在 一 个 例 子 中 ,cat 命 令 没有 文 件 名 参 数 。 没 有 文 件 名 参 数 的 cat 命 令 将 会 从 标 准 输 入 中 接 收 输 入 并 将 输出 送 往 标 准 输 出 。 然 而 , 标 准 输 入 被 重 定 向 为 从 一 个 文 件 中 接 受 数 据 ,而 标 准 输 出重 定 向 为 将 数 据 置 于 一 个 文 件 中 。

$ cat <mylttev >neolettev

管 道 :|

你 有 时 会 发 现 处 于 这 样 一 种 情 形 , 你 需 要 将 数 据 由 一 个 命 令 传 至 另 一 个 命令 。 换 句 话 说 , 你 想 将 一 个 命 令 的 标 准 输 出 送 向 另 一 个 命 令 , 而 不 是 一 个 目 的 文件 。 假 设 你 想 将 一 个 文 件 列 表 送 往 打 印 机 。 你 需 要 执 行 两 个 命 令 来 完 成 这 一 工作 :ls 命 令 来 产 生 文 件 列 表 和 lpr 命 令 来 将 列 表 送 往 打 印 机 。实 际 上 ,你 需 要 获 得 ls 命 令 的 输 出 并 将 之 作 为 lpr 命 令 的 输 入 。 你 可 以 想 象 为 数 据 由 一 个 命 令 流 向 另 一个 命 令 。 要 在 linux 中 形 成 这 样 一 种 联 系 , 你 应 使 用 称 为 管 道 的 功 能 。 管 道 操 作符 |( 竖 线 条 字 符 ) 放 在 两 个 命 令 之 间 二 者 之 间 形 成 了 联 系 。 一 个 命 令 的 标 准 输 出成 了 另 一 个 命 令 的 标 准 输 入 。 管 道 操 作 接 收 了 置 于 管 道 之 前 的 命 令 的 输 出 , 并 将数 据 作 为 置 于 管 道 之 后 命 令 的 输 入 。 如 下 例 所 示 ,你 可 以 用 一 个 管 道 符 将 ls 命 令和 lpr 命 令 连 接 起 来 ,ls 命 令 产 生 的 文 件 名 列 表 被 通 过 管 道 送 往 lpr 命 令 。

$ ls | lpr

你 可 以 将 管 道 操 作 同 诸 如 特 殊 字 符 等 shell 的 其 它 特 生 结 合 起 来 ,并 完 成 一 些特 殊 的 操 作 。 下 一 个 例 子 中 只 打 印 了 以 .c 为 扩 展 的 文 件 。 ls 命 令 利 用 星 号 和 .c 来 产 生 一 个 只 具 有 .c 扩 展 的 文 件 列 表 , 然 后 这 一 列 表 被 通 过 管 道 送 往 lpr 命 令 。

$ ls * .c | lpr

重 定 向 只 是 简 单 地 将 输 出 放 入 一 个 文 件 , 管 道 则 将 输 出 送 往 另 一 个 linux 命令 。 你 也 许 想 知 道 为 什 么 这 一 功 能 不 能 由 重 定 向 来 完 成 。 人 在 头 脑 中 保 持 一 个文 件 和 一 个 命 令 之 间 区 别 的 概 念 : 一 个 文 件 是 一 个 包 含 数 据 的 存 贮 媒 体 。 你 可 以对 之 存 贮 或 读 。 一 个 命 令 是 执 行 指 令 的 程 序 。 一 个 命 令 可 能 会 对 文 件 进 行 数 据

的 读 写 , 但 命 令 本 身 绝 不 是 文 件 。 重 定 向 可 将 数 据 由 一 个 程 序 送 往 一 个 文 件 ,但 它不 能 将 数 据 从 一 个 程 序 送 往 另 一 个 程 序 。 只 有 文 件 才 能 成 为 重 定 向 操 作 的 目 的地 ,程 序 则 不 能 。

然 而 你 可 以 通 过 一 系 列 的 重 定 向 操 作 来 模 拟 管 道 的 过 程 。 你 可 以 将 一 个 命令 的 输 出 送 入 一 个 文 件 。 然 后 ,在 第 二 行 ,你 可 以 将 此 文 件 作 为 要 执 行 命 令 的 重 定向 的 输 入 。 下 一 个 例 子 用 了 两 个 不 同 的 命 令 的 重 定 向 来 打 印 一 个 文 件 名 列 表 。同 样 的 任 务 在 上 一 个 例 子 中 已 由 管 道 操 作 完 成 。 管 道 操 作 字 面 上 获 得 一 个 命 令的 标 准 输 出 并 将 之 作 为 另 一 个 命 令 的 标 准 输 入 。

$ ls * .c > tenpfile

$ lpr < tenpfile

到 现 在 为 止 , 我 们 一 直 利 用 文 件 名 来 作 输 入 , 但 是 管 道 是 作 用 于 一 个 命 令 的 标准 输 出 的 , 而 不 管 这 一 输 出 是 什 么 。 注 意 到 这 一 点 是 非 常 重 要 的 。 一 个 文 件 甚 至几 个 文 件 的 内 容 都 可 能 通 过 管 道 由 一 人 命 令 送 往 另 一 个 。 在 下 一 个 例 子 中 ,cat 命 令 读 入 mydata 文 件 的 内 容 ,并 将 内 容 输 出 , 然 后 通 过 管 道 送 给 lpr 命 令 。

$ cat mydata | lpr

假 定 你 想 将 敲 入 的 字 符 打 印 ,而 不 是 一 个 文 件 的 数 据 。 记 住 没 有 文 件 参 数 的cat 命 令 将 从 标 准 输 入 中 读 入 数 据 。 在 下 一 个 例 子 中 ,cat 从 键 盘 , 而 不 是 从 文 件中 读 入 输 入 ,并 将 输 出 通 过 管 道 送 往 lpr 命 令 ,cat 命 令 在 lpr 命 令 之 前 执 行 ,因 此你 可 以 先 在 键 盘 上 敲 入 你 的 数 据 ,并 以 文 件 结 束 符 CTRLD 结尾 ,一 个 管 通 的 byte 流 可 能 来 自 于 任 何 来 源 。

$ cat | lpr This text will

be printed

^D

$

Linux 为 cat 提 供 了 一 个 -n 选 项 以 在 输 出 文 件 内 容 时 , 加 入 行 的 标 量 。 你 想打 印 有 行 标 量 的 文 件 ,然 后 将 此 输 入 送 往 lpr 命 令 进 行 打 印 。 例 如 :

$ cat -n m ydata | lpr

为 显 示 一 个 具 有 行 标 量 的 文 件 , 你 做 的 大 都 是 同 样 的 事 情 , 在 这 种 情 况 下 ,有 标号 的 输 出 通 常 会 由 管 道 送 到 more 命 令 以 进 行 一 屏 幕 一 屏 幕 的 检 查 。 你 甚 至 可同 时 指 定 几 个 文 件 , 把 它 们 的 输 出 由 管 道 送 到 more 命 令 ,来 检 查 所 有 这 些 文 件 。在 下 一 个 例 子 中 ,mydata 和 preface 文 件 都 被 标 量 并 由 管 道 送 到 more 命 令 以 进行 屏 幕 检 查 。

$ cat -n mydata preface | more

Linux 有 许 多 命 令 可 产 生 修 改 过 的 输 出 ; 有 -n 选 项 的 cat 命 令 即 是 其 中 之一 。 另 一 个 是 sort 命 令 。 sort 命 令 读 入 文 件 内 容 ,并 且 产 生 一 个 以 首 字 母 顺 序 来安 排 每 行 的 版 本 。 这 一 命 令 叫 作 过 滤 器 。 过 滤 器 将 在 14 章 详 细 讨 论 它 们 通 常 同管 道 一 起 工 作 。 在 下 一 个 例 子 中 ,产 生 了 mylist 的 一 个 被 sort 处 理 过 的 版 本 并 将之 由 管 道 - 送 往 more 命 令 以 便 进 行 屏 幕 的 显 示 。 注 意 原 有 的 文 件 ,my list 并 没 有改 变 本 身 也 没 有 被 sort 处 理 。 只 有 sort 在 标 准 输 出 中 的 输 出 才 会 被 会 分 类 。

$ sort mylist | more

你 当 然 可 以 将 几 个 命 令 组 合 起 来 ,并 将 每 对 用 管 道 符 连 接 起 来 。 一 个 命 令 的输 出 可 由 管 道 送 往 另 一 命 令 ,然 后 ,另 一 命 令 也 可 将 它 的 输 出 送 往 第 三 个 命 令 。 假定 你 有 一 个 清 单 列 表 的 文 件 , 你 想 把 它 用 字 母 序 和 行 号 把 它 打 印 出 来 。 要 打 印 这

种 字 母 序 有 行 号 的 文 件 , 你 可 以 先 用 sort 命 令 产 生 一 个 处 理 过 的 版 本 ,然 后 用 管道 送 给 cat 命 令 。 有 -n 选 项 的 cat 命 令 把 sort 处 理 过 的 列 表 作 为 自 己 的 输 入 ,然后 产 生 一 人 首 字 母 序 ,有 行 号 的 列 表 输 出 ,并 将 之 由 管 道 送 往 lpr 命 令 进 行 打 印 。下 一 个 例 子 中 展 示 了 这 一 命 令 ,图 5-3 说 明 了 mylist 的 一 个 首 字 母 序 ,有 行 号 的 版本 如 何 进 行 打 印 。

$ sort mylist | cat -n | lpr

你 也 可 能 用 一 种 比 较 繁 琐 的 办 法 来 完 成 这 一 任 务 , 利 用 重 定 向 和 若 干 单 独 的命 令 。 在 这 种 情 况 下 ,需 要 两 个 新 的 临 时 文 件 (sfile 和 nfile)来 存 贮 每 一 操 作 的 输出

$ sort mylist > sfile

$ cat -n < sfile >nifle

$ lpr < nfile

第 二 部 分 Linux 操 作 - 图3

图 5-3 连接 x 多个命令的管道

利 用 标 准 输 出 参 数 -,可 以 细 致 地 控 制 管 道 送 往 一 个 命 令 的 标 准 输 入 。 当 你 用横 线 作 为 一 个 命 令 的 参 数 时 , 它 代 表 着 标 准 输 入 。 假 定 你 想 打 印 一 个 有 顶 部 有 其目 录 的 文 件 形 式 ,pwd 命 令 输 出 一 个 目 录 名 ,cat 命 令 输 出 一 个 文 件 的 内 容 。 在 这种 情 况 下 ,cat 命 令 需 要 将 文 件 和 由 管 道 传 送 的 pwd 命 令 的 标 准 输 入 同 进 作 为 自己 的 输 入 。 cat 命 令 将 有 两 个 参 数 : 由 横 线 代 表 的 标 准 输 入 和 要 打 印 的 文 件 名 。

下 一 个 例 子 中 ,pwd 命 令 产 生 了 目 录 名 并 由 管 道 送 往 cat 命 令 。 对 cat 命 令而 言 ,由 管 道 送 入 的 标 准 输 入 现 在 包 含 着 目 录 名 。 如 横 线 所 代 表 的 ,标 准 输 入 现 在是 cat 命 令 的 第 一 个 参 数 。 cat 命 令 将 目 录 名 和 文 件 的 内 容 拷 贝 到 标 准 输 出 , 并由 管 道 送 往 lpr 命 令 以 进 行 打 印 。 如 果 你 想 将 目 录 名 印 在 文 件 内 容 之 后 ,只 要 把横 线 作 为 后 一 个 参 数 ,文 件 名 作 第 一 个 参 数 即 可 ,正 如 cat mylist - 。

$ pwd | cat -mylist | lpr

管 道 和 重 定 向 :tee

假 定 你 想 将 标 准 输 入 重 定 向 到 一 个 文 件 并 且 同 时 , 在 屏 幕 上 显 示 输 出 的 内 容 ,

这 样 你 便 可 以 确 认 你 在 存 贮 的 东 西 。 用 tee 命 令 你 便 可 以 做 到 这 一 点 。

tee 命 令 将 标 准 输 出 拷 贝 到 一 个 文 件 , 标 准 输 出 被 拷 贝 到 的 新 文 件 是 tee 命 令的 参 数 。 标 准 输 出 继 续 前 进 , 但 当 它 经 过 tee 命 令 时 , 它 的 内 容 被 拷 贝 到 一 个 文件 。 这 就 好 像 标 准 输 出 被 分 作 两 个 拷 贝 , 一 个 被 重 定 向 入 一 个 文 件 ,而 另 一 个 叫 继续 前 进 , 通 常 是 去 往 显 示 设 备 。 下 一 个 例 子 将 文 件 mylist 的 内 容 拷 贝 到 文 件newlist 中 ,并 将 内 容 显 示 在 屏 幕 上 。

$ cat mylist | tee newlist

当 你 正 在 更 改 输 出 , 并 且 你 想 将 输 出 存 入 一 个 文 件 ,同 时 要 观 察 到 更 改 的 内 容时 ,tee 命 令 是 非 常 方 便 的 。 在 下 一 个 例 子 中 ,文 件 mylist 又 被 sort 处 理 并 且 处 理的 内 容 由 管 道 送 至 tee 命 令 。 tee 命 令 既 将 sort 处 理 的 输 出 存 入 一 个 叫 作 sfile 的 文 件 , 又 将 其 屏 幕 上 显 示 了 出 来 。

$ sort mylist | tee sfile compwter

ncodem screen

$

你 也 可 以 利 用 重 定 向 将 输 出 存 一 个 文 件 ,然 后 再 它 打 印 出 来 。

$ sort mylist >sfile

$ cat sfile

computer screen

$

假 如 ,你 需 要 将 你 的 输 出 存 入 一 个 文 件 并 且 把 它 打 印 出 来 。 这 种 情 况 下 , 标 准输 出 需 要 传 送 另 一 个 命 令 。 你 需 要 利 用 tee 命 令 来 把 输 出 拷 贝 到 一 个 文 件 中 ,同时 让 标 准 输 出 经 管 道 关 入 下 一 个 命 令 。 在 下 一 个 例 子 中 ,sort 命 令 的 输 入 首 先 由管 道 送 到 tee 命 令 ,tee 命 令 将 输 出 拷 贝 入 文 件 sfile 。 输 出 本 身 再 由 管 道 送 到 lpr 命 令 以 进 行 打 印 。

$ sort mylist |tee sfile | lpr

当 你 使 用 管 道 和 重 定 向 时 要 当 心 。 标 准 输 出 的 重 定 向 确 定 了 标 准 输 出 的 目的 地 。 标 准 输 出 会 被 存 贮 在 那 一 目 的 文 件 中 。 一 旦 被 存 贮 , 就 没 有 什 么 输 出 由 管道 送 往 下 一 个 命 令 了 。 重 定 向 不 能 在 管 道 内 部 发 生 , 尽 管 它 可 以 被 置 于 一 系 列 管道 操 作 的 末 尾 。 下 一 个 例 子 是 管 道 和 重 定 向 的 可 行 的 使 用 方 法 。 sort 命 令 的 输出 经 由 管 道 送 往 带 -n 选 项 的 cat 命 令 来 加 入 行 标 量 , 最 后 的 结 果 被 存 贮 在 文 件nfile 中 。

$ sort mylist | cat -n >nfile

如 果 你 想 要 将 文 件 存 入 nfile 并 把 它 打 印 出 来 应 应 样 ? 你 不 能 做 如 下 类 似 的操 作 :

sort mylist | cat -n > nfile | lpr ERROR

存 贮 文 件 并 将 之 进 行 打 印 的 唯 一 方 法 是 使 用 tee 命 令 ,

$ sort mylist | cat -n | tee nfile | lpr

你 可 以 在 管 道 序 列 的 任 何 地 方 使 用 tee 命 令 。 下 一 个 例 子 中 存 贮 了 列 表 的

  • 个 sort 处 理 的 版 本 并 打 印 了 一 加 行 标 号 的 另 一 个 版 本

$ sort mylist | tee sfile | cat -n | lpr

重 定 向 和 管 道 处 理 标 准 错 误 (standard Error): >&, 2>

当 你 执 行 命 令 时 , 有 可 能 会 有 错 误 发 生 。 你 可 能 给 出 了 数 目 不 正 确 的 参 数 , 也有 可 能 发 生 某 种 系 统 错 误 。 当 发 生 错 误 时 ,系 统 会 产 生 一 个 错 误 信 息 。 通 常 情 况下 ,这 一 错 误 信 息 会 同 标 准 输 出 一 起 显 示 在 屏 幕 上 。 然 而 ,Linux 系 统 对 标 准 输 出和 错 误 信 息 是 有 区 别 的 。 错 误 信 息 被 放 入 另 一 个 被 称 作 ” 标 准 错 误 ” 的 标 准 byte 流 中 。 在 下 一 个 例 子 中 ,cat 命 令 中 的 参 数 是 一 个 不 存 在 的 文 件 名 ,myintro 。 这 种情 况 下 ,cat 命 令 将 会 产 生 一 个 错 误 :

$ cat myintro

cat :myintro not found.

$

因 为 错 误 信 息 是 在 除 标 准 输 出 外 的 另 一 单 独 的 数 据 流 中 , 即 使 你 已 将 标 准 输出 重 定 向 到 一 个 文 件 ,错 误 信 息 仍 然 会 在 屏 幕 上 显 示 。 在 下 一 个 例 子 中 ,cat 命 令的 标 准 输 出 被 重 定 向 到 文 件 mydate 中 ,然 而 , 包 含 着 错 误 信 息 的 标 准 错 误 仍 然 被定 向 于 屏 幕 。

$ cat myintro > mydata cat : m yintro not found

$

如 同 标 准 输 出 一 样 , 你 也 可 以 对 标 准 错 误 重 定 向 。 这 意 味 着 你 可 以 将 错 误 信

息 存 入 一 个 文 件 ,以 备 将 来 参 考 。 如 果 你 需 要 一 个 错 误 记 录 的 话 ,这 一 功 能 是 非 常有 用 的 。 如 同 标 准 输 出 一 要 ,标 准 错 误 的 缺 少 目 的 地 也 是 显 示 设 备 ,但 你 可 以 利 用特 殊 的 重 定 向 操 作 符 将 标 准 错 误 定 向 到 文 件 或 你 选 择 的 任 何 设 备 。 在 这 种 情 况下 , 错 误 信 息 将 不 会 在 屏 幕 上 显 示 。 对 标 准 错 误 的 重 定 向 依 赖 于 shell 重 定 向 的一 个 特 殊 的 特 征 。 你 可 以 在 重 定 向 操 作 中 利 用 数 字 访 问 所 有 的 标 准 byte 流 。 数字 0,1 和 2 分 别 代 表 着 标 准 输 入 ,标 准 输 出 和 标 准 错 误 。 缺 省 情 况 下 ,输 出 重 定 向

> 作 用 于 标 准 输 出 。 然 而 , 利 用 在 输 出 重 操 作 符 前 加 入 2, 你 也 可 将 输 出 重 定 向 列

改 为 对 标 准 错 误 进 行 操 作 。 在 下 一 个 例 子 中 ,cat 命 令 又 会 产 生 一 个 错 误 。 错 误信 息 被 重 定 向 到 以 2 为 标 量 的 标 准 byte 流 , 标 准 错 误 中 ,

$ cat nodata 2> myerrors

$ cat merrors

cat : nodata not found

$

你 也 可 以 将 错 误 信 息 添 加 入 一 个 文 件 ,只 要 利 用 数 字 2 和 重 定 向 添 加 操 作 符

>> 即 可 。

在 下 一 个 例 子 中 , 用 户 将 标 准 错 误 添 加 入 文 件 myerrors 中 ,这 样 myerrors 便成 为 一 个 错 误 的 记 录 。

$ cat nodata 2 >> myerrors

$ cat compls 2>> myerrors

$ cat myerrors

cat : nodata not found cat : compls not found

$

如 果 要 同 进 对 标 准 输 出 和 标 准 错 误 重 定 向 , 你 需 要 为 二 者 加 入 各 自 的 重 定 向操 作 符 和 文 件 。 在 下 个 例 子 中 ,标 准 输 出 被 重 定 向 到 文 件 mydata ,而 标 准 错 误 被重 定 到 文 件 myerrors 中 。 如 果 nodata 确 实 存 在 ,文 件 mydata 将 包 含 它 内 容 的一 个 拷 贝 。

$ cat nodata 1 > mydata > myerrors

$ cat myerrors

cat : nodata not found

$

然 而 , 如 果 你 想 把 错 误 信 息 ,同 重 定 向 的 标 准 输 出 存 入 同 一 个 文 件 中 ,你 需 要 将标 准 错 误 重 定 向 到 标 准 输 出 。 在 BASH shell 中 , 你 可 以 在 数 据 流 的 数 字 前 面 加入 一 个 & 号 来 进 行 对 标 准 数 据 流 的 访 问 ,&1 指 向 标 准 输 出 。 你 可 以 在 重 定 向 操作 中 利 用 这 种 访 问 方 法 ,将 一 个 标 准 byte 流 作 为 一 个 目 的 文 件 。重 定 向 操 作 2>&1 将 标 准 错 误 重 定 向 到 标 准 输 出 。

结 果 , 标 准 输 出 成 为 了 标 准 错 误 的 一 个 目 的 文 件 。与 之 相 反 ,重 定 向 操 作 1>&2

将 标 准 输 出 重 定 向 到 标 准 错 误 。

在 下 一 个 例 子 中 ,cat 命 令 使 用 了 一 个 不 存 在 的 文 件 -nodata- 来 作 它 的 参 数 , 结 果 产 生 的 错 误 信 息 的 重 定 向 到 文 件 mydata 。 标 准 错 误 和 标 准 输 出 的 内 容 都 将被 存 入 同 一 个 文 件 中 mydata 。 错 误 信 息 不 再 继 续 在 屏 幕 上 显 示 而 是 存 入 一 个 文件 之 中 。 如 果 想 看 错 误 , 信 息 只 须 显 示 文 件 mydata 的 内 容 即 可 。 如 果 nodata 文 件 确 实 存 在 ,mydata 将 包 含 nodata 文 件 的 内 容 而 不 是 错 误 信 息 。

$ cat nodata 1> mydata 2>&1

$ cat mydata

cat :nodata not found

>& 操 作 的 缺 省 输 出 流 是 标 准 输 出 ,缺 省 输 入 流 是 标 准 错 误 。 如 果 这 一 操 作 前后 没 有 数 字 , 正 如 下 一 个 例 子 所 示 , 任 何 错 误 信 息 都 会 被 重 定 向 到 标 准 输 出 , 并 同标 准 输 出 一 同 存 入 其 目 的 文 件 。

$ cat nodata > & mydata

shell 变 量

你 在 shell 当 中 定 义 一 个 变 量 ,这 一 变 量 被 称 作 - 逻 辑 上 -shell 变 量 。 现 在 有 许多 不 同 的 shell 。 一 些 应 用 ,例 如 mailx 应 用 ,有 自 己 的 shell 程 序 和 shell 变 量 。你 也 可 以 利 用 所 谓 的 shell scripts 来 创 建 自 己 的 shell。 你 有 一 个 一 旦 登 录 之 后便 被 激 活 的 用 户 shell 。 这 通 常 被 称 作 登 录 shell 。 特 殊 的 系 统 变 量 便 是 在 这 个 登录 shell 中 定 义 的 。 shell 变 量 在 你 的 shell 的 激 活 状 态 中 一 直 存 在 ,意 即 直 到 你出 shell 为 止 。 例 如 , 注 销 即 会 退 出 现 存 的 登 录 shell。 当 你 再 一 次 登 录 时 , 你 在 登录 (login) shell 所 需 的 任 何 变 量 都 必 须 重 新 进 行 定 义 。

变 量 的 定 义 和 Evaluation: =,$, set, unset

当 你 首 次 用 变 量 名 时 ,你 便 在 shell 中 定 义 了 一 个 变 量 。 一 个 变 量 的 名 字 可 以

是 字 母 表 中 任 何 字 母 的 字 符 集 ,也 包 括 下 划 线 。 变 量 名 中 也 可 以 包 含 数 字 ,但 数 字不 能 是 名 字 的 第 一 个 字 符 。 名 字 当 中 不 能 有 其 它 类 型 的 字 符 ,例 如 冒 号 、 & 号 , 甚至 不 能 有 空 格 。 这 些 符 号 由 shell 保 留 自 用 。 并 且 ,名 字 不 能 超 过 一 个 词 。 Shell 利 用 空 格 来 区 分 命 令 行 中 命 令 的 不 同 要 素 ,诸 如 选 项 ,参 数 和 命 令 的 名 字 。

你 可 用 赋 值 操 作 符 = 来 给 给 变 量 赋 值 。 你 应 敲 入 变 量 名 ,赋 值 操 作 符 , 然 后 是要 赋 的 值 。 不 要 在 赋 值 操 作 符 前 后 留 任 何 空 格 。 诸 如 poet = Virgil 的 赋 值 操作 会 失 败 。 (c-shell 有 一 个 稍 微 不 同 的 赋 值 操 作 ,在 本 章 稍 后 的 c- shell 变 量 中 将会 谈 及 ) 你 可 以 将 任 何 字 符 集 赋 给 一 个 变 量 。 下 一 个 例 子 中 , 变量 poet 被 赋 值 为字 符 串 V ivgil

$ poet=Vivgil

一 旦 你 为 一 个 变 量 进 行 了 赋 值 , 你 便 可 以 利 用 变 量 名 来 引 用 所 赋 值 。 通 常 你可 以 把 变 量 的 值 作 为 一 个 命 令 的 参 数 。 利 用 在 变 量 名 前 加 $ 操 作 符 ,你 便 可 以 引用 变 量 值 了 。 美 元 符 是 一 种 利 用 变 量 名 来 引 用 变 量 值 的 特 殊 字 符 。 Evalwation 可 获 得 变 量 的 值 ,通 常 是 一 个 字 符 集 合 。 这 个 字 符 集 将 代 替 命 令 行 中 的 变 量 名 。只 要 变 量 名 前 加 入 了 $ 符 , 这 个 变 量 名 就 会 被 变 量 值 所 代 替 。 在 下 一 个 例 子中 ,shell 变 量 poec 被 取 值 ,它 的 内 容 ,Virgil, 被 用 作 echo 命 令 的 参 数 。 echo 命 令只 是 简 单 地 将 字 符 集 显 示 在 屏 幕 上 。

$ echo $ poet V irgil

你 必 须 仔 细 区 分 对 变 量 取 值 和 变 量 名 本 身 。 如 果 变 量 名 之 前 你 没 有 加 入 $

符 , 那 么 你 就 只 有 变 量 名 本 身 , 在 下 一 个 例 子 中 ,变 量 名 之 前 没 有 $ 操 作 符 。 在 这种 情 况 下 ,echo 命 令 将 ” poe t” 作 为 自 己 的 参 数 , 因 此 显 示 了 ”poet ”。

$ echo poet poet

变 量 的 内 容 常 被 用 作 命 令 的 参 数 。 一 种 通 常 的 命 令 参 数 是 一 个 目 录 路 径 名 。

要 重 复 的 键 入 相 同 的 目 录 路 径 是 很 乏 味 的 。 如 果 你 把 一 个 目 录 路 径 名 赋 值 给 一个 变 量 , 你 不 对 变 量 取 值 即 可 。 当 对 变 量 用 $ 操 作 符 取 值 时 , 你 便 得 到 赋 给 这 个 变量 的 目 录 路 径 。 下 一 个 例 子 中 将 目 录 路 径 名 赋 给 一 个 变 量 , 并 在 copy 命 令 中 使用 了 变 量 的 值 。 ldir 的 取 值 ( 即 $ldir) 是 路 径 名 /home/chris/letters. copy 命 令 等价 为 cp my/etter/home/chris/letters.

$ ldir =/home/chris/lettevs

$ cp myletter $ ldir

你 可 以 利 用 set 命 令 获 得 已 定 义 变 量 的 列 表 。 下 一 个 例 子 利 用 set 命 令 显 示了 所 有 已 定 义 变 量 和 它 们 的 值 。

$ set poet virgil

ldir/home/chris/letters/old

$

TCSH shell 变 量

TCSH chell 中 的 变 量 与 BASH chell 只 有 一 点 极 小 的 差 别 。 在 TCSH shell 中 ,你 要 用 set 命 令 和 赋 值 操 作 符 对 一 个 变 量 赋 值 。 要 给 一 个 变 量 赋 值 , 首 先 键 入set, 然 后 是 变 量 名 ,赋 值 操 作 符 ,和 要 赋 的 值 ,赋 值 操 作 符 必 须 前 后 都 有 或 都 没 有 空

格 .例 如 — — set poet=Virgil 是 一 个 错 误 , 在 下 面 ,变 量 poet 被 赋 值 为 Virgil: set poet=Vigil

同 BASH shell 类 似 ,TCSH SHELL 利 用 美 元 符 进 行 取 值 ,取 值 操 作 获 得变 量 的 值 , 它 通 常 是 一 套 字 符 集 。 然 后 字 符 将 代 替 命 令 中 的 变 量 名 。 在 下 一 个 例子 中 ,shell 变 是 poet 被 取 值 , 其值 V irgil 被 作 为 echo 命 令 的 参 数 .

>echo $poet V igril

同 BASH shell 一 样 ,双 引 号 , 单 引 号 ,和 横 线 会 取 制 特 殊 字 符 的 取 值 . 下 一 个 例

子 中 ,双 引 号 限 制 了 特 殊 字 符 ? 。

>set hotice="Is the meeting romorrow?"

>echo $hotice

Is the meeting tomorrow?

>

shell 脚 本 : 用 户 定 义 的 命 令

你 可 以 把 shell 命 令 放 入 一 个 文 件 ,然 后 让 shell 从 文 件 中 读 并 执 行 这 些 命令 。 在 这 种 意 义 上 ,文 件 成 为 shell 一 个 程 序 , 它 象 程 序 中 的 语 句 一 样 执 行 shell 的 命 令 . 包 含 着 shell 命 令 的 一 个 文 件 被 称 作 shell 脚 本 。

你 可 以 利 用 一 个 标 准 的 文 本 编 值 器 ,如 Vi, 来 将 shell 命 令 键 入 一 个 script 文件 。 sh 或 。 命 令 再 加 上 文 件 名 , 将 会 读 script 文 件 并 执 行 其 中 的 命 令 ,下 一 个 例

子 中 ,文 本 文 件 lsc 中 包 含 着 ls 命 令 ,它 将 只 到 出 带 .c 为 后 缀 的 文 件 . lsc

ls *c

$ sh lsc main.c calc.c

$ .lsc

maim.c calc.c

你 可 以 利 用 对 script 文 件 的 执 行 许 可 的 设 置 来 避 免 sh 或 .命 令 的 使 用 。 当

script 文 件 最 早 由 文 本 编 辑 器 创 建 时 ,它 只 有 读 和 写 的 许 可 。 chmod 命 令 加 入 +

× 选 项 将 给 予 script 文 件 执 行 许 可 ,( 第 7 章 中 将 讨 论 许 可 ) 一 旦 它 是 可 执 行 的 , 在shell 提 示 符 后 键 入 文 件 名 并 加 回 车 ,文 件 和 其 中 的 shell 命 令 将 被 执 行 ,在 效 果上 ,script 文 件 名 变 成 了 一 个 新 命 令 名 。 这 样 ,你 便 可 以 利 用 script 文 件 来 设 计 并创 建 自 己 的 linux 命 令 ,.你 只 须 设 置 一 次 许 可 ,在 下 一 例 子 中 ,lsc 文 件 所 有 者 的 执行 许 可 被 设 置 为 开 。然 后 lsc 这 一 shell script 如 同 其 它 linux 命 令 一 样 得 到 执 行 。

$ chwod u+x lsc

$ lsc

main.c calc.c

如 同 其 它 limux 命 令 一 样 ,shell script 也 可 以 接 受 参 数 ,命 令 行 上 的 参 数 被 依次 自 上 来 引 用 .利 用 $ 操 作 符 和 位 置 的 标 识 可 以 来 引 用 参 数 ,第 一 个 参 数 可 由 $1 引用 , 第 二 个 参 数 $2 , 以 此 类 推 , 在 下 一 个 例 子 中 ,lsext script 打 印 有 特 殊 扩 展 的 文件 。第 一 个 参 数 是 扩 展 ,该 script 以 参 数 C 执 行 ,( 当 然 ,可 执 行 许 可 已 被 设 置 过 了 )。

lsext

ls * $l

$ lsext c main.c calc.c

在 下 一 个 例 子 中 , 打 印 具 有 行 标 号 文 件 的 命 令 已 被 放 入 一 个 可 执 行 文 件

/phum 中 ,/phum 以 一 个 文 件 各 作 为 参 数 。 打 印 行 标 号 的 命 令 在 后 台 执 行 。

lphum

pr -t -n$1/lp&

$ lphum mnydata

你 可 能 会 同 时 利 用 不 止 一 个 变 量 ,变 量 数 目 可 能 会 变 化 。 利 lphum 你 可 能 一次 想 打 印 三 个 文 件 , 也 可 能 是 五 个 文 件 。 $ 操 作 符 再 加 上 星 号 ,$* ,引 用 命 令 行 上 所有 的 参 数 。 利 用 $* 你 便 可 以 接 收 数 目 可 变 的 参 数 。 在 下 一 个 例 子 中 ,lphum 使 用了 $* ,这 样 它 便 可 以 接 受 可 变 数 目 的 参 数 了 。

lphum

pr--t--n$*/lp&

$lphum mydata prefae

使 用 shell script 是 为 命 令 创 建 别 名 的 另 外 一 种 方 法 。 在 下 一 个 例 子 中 , 比如 :shell script 包 含 着 一 个 有 一 定 选 项 的 rm 命 令 。 rm 在 删 除 一 个 文 件 之 前 会 征求 用 户 的 认 可

rmi rm-i $*

$rmi mydata docl

作 业 : 后 台 , 杀 除 (kills )和 中 断

在 Linux 中 ,你 不 仅 可 以 控 制 命 令 的 输 入 、 输 出 ,也 可 以 控 制 它 的 执 行 。 你 可以 在 执 行 命 令 的 同 时 在 后 台 运 行 一 个 作 业 。 你 也 可 以 在 命 令 执 行 完 之 前 取 消 一个 命 令 。 你 其 至 可 以 中 断 一 个 命 令 ,然 后 再 从 断 的 地 方 继 续 执 行 ,后 台 操 作 对 于 大作 业 非 常 有 利 的 ,无 须 在 终 端 前 等 待 一 个 命 令 执 行 结 束 ,你 可 以 把 它 放 入 后 台 。 这样 你 便 可 以 执 行 其 它 的 Linux 命 令 。 例 如 ,你 可 以 在 其 它 一 些 文 件 打 印 时 偏 辑 另一 个 文 件 。

取 消 一 个 后 台 的 命 令 常 常 会 为 你 节 省 许 多 不 必 要 的 开 支 。 假 如 说 , 你 执 行 了

  • 个 命 令 来 打 印 所 有 的 文 件 , 你 又 意 识 到 有 一 些 非 常 大 的 文 件 , 你 并 不 想 打 印 , 你可 以 引 用 打 印 命 令 的 执 行 并 将 之 取 消 ,对 命 令 的 中 断 是 不 经 常 使 用 的 ,有 时 , 它 是无 意 中 进 行 的 , 只 要 你 想 ,你 便 可 以 中 断 一 个 编 辑 过 程 去 发 送 ma il, 然 后 再 回 到 编辑 会 话 中 ,从 离 开 的 地 方 开 始 。 后 台 命 令 和 取 消 及 中 断 作 业 的 命 令 见 表 5-2 。

在 Linux 中 ,命 令 被 视 为 一 个 进 程 — 要 执 行 的 任 务 ,Linux 系 统 同 时 可 以 执 行多 个 进 程 ,正 如 同 Linux 系 统 可 以 同 时 处 理 几 个 用 户 一 样 。 有 一 些 命 令 可 以 来 检查 和 控 制 进 程 , 而 这 些 命 令 通 常 是 为 系 统 监 察 操 作 而 保 留 的 。 实 际 上 进 程 不 仅 包括 了 用 户 执 行 的 命 令 ,还 包 括 了 系 统 执 行 的 以 维 持 Linux 运 行 的 许 多 任 务 。

用 户 执 行 的 进 程 通 常 被 称 为 作 业 ,以 此 区 别 系 统 进 程 。 当 用 户 执 行 一 个 命 令时 , 它 便 成 为 等 待 系 统 执 行 的 一 个 作 业 ,shell 提 供 了 一 套 作 业 控 制 操 作 以 便 用 户控 制 作 业 的 执 行 ,你 可 以 把 作 业 在 后 台 ,取 消 或 中 断 一 个 作 业 。

后 台 和 前 台 :& fg bg

在 一 个 命 令 后 面 加 入 一 个 ”& ” 符 号 , 你 就 可 以 在 后 台 执 行 这 一 命 令 。 当 你 这 么做 的 时 候 , 屏 幕 会 显 示 一 个 用 户 的 作 业 号 和 系 统 的 进 程 号 。 放 在 中 括 号 中 的 用 户数 , 是 用 户 可 以 对 它 进 行 引 用 的 号 码 。 系 统 进 程 号 是 系 统 对 这 一 个 任 务 的 标 识号 。 在 下 一 例 子 中 , 打 印 文 件 mydata 的 命 令 被 置 于 后 台 执 行 。

$ lpr mydata & [1] 534

$

你 可 以 把 不 止 一 个 命 令 放 在 后 台 执 行 。 每 一 个 命 令 都 被 标 识 为 一 个 任 务 并且 有 一 个 名 字 和 一 个 任 务 号 。 jobs 命 令 会 列 出 所 有 在 后 台 执 行 的 任 务 。 表 中 的每 一 行 都 包 括 一 个 中 括 号 内 的 任 务 号 ,以 及 任 务 名 ,而 不 管 该 任 务 已 终 止 或 还 在 运行 。 ”+ ” 号 表 明 该 任 务 当 前 正 在 被 处 理 ,” - ” 号 标 明 了 下 一 个 要 被 执 行 的 任 务 。 在 下一 个 例 子 中 , 两 个 命 令 被 放 入 后 台 执 行 。 jobs 命 令 列 出 了 这 些 任 务 , 并 显 示 哪 个任 务 正 被 执 行 。

$ lpr intro & [1] 547

$ cat *,C > mnyprogs &

[2] 548

$ jobs

[1] + Running lpr intro

[2] - Running cat * · c >nnyprogs

$

如 果 你 愿 意 , 可 以 在 命 令 行 上 以 ”& ” 号 为 间 隔 敲 入 几 个 命 令 , 然 后 将 这 些 命 令同 时 放 入 后 台 执 行 。 在 这 种 情 况 下 ,”& ” 号 不 仅 在 命 令 行 上 将 命 令 进 行 了 隔 离 , 还将 这 些 命 令 置 于 后 台 执 行 。 在 下 一 个 例 子 中 ,第 一 个 命 令 将 所 有 具 有 .l 扩 展 的 文件 sort 处 理 并 且 重 定 向 , 这 个 命 令 被 置 于 后 台 。 在 同 一 命 令 行 上 的 第 二 命 令 , 打印 有 .c 扩 展 的 文 件 ,也 被 放 到 后 台 执 行 。注 意 这 两 个 命 令 都 是 以 ”& ” 号 结 尾 的 。jobs 命 令 然 后 将 sort 和 lpr 命 令 作 为 单 独 的 操 作 列 出 。

$ sort *.l >/ldocs & /lpr *.c & [1] 534

[2] 567

$ jobs

[1] + Running sort *.l > ldocs [2]- Running lpr

$

在 你 执 行 完 linux 中 的 任 何 命 令 时 ,如 果 你 有 运 行 于 后 台 的 作 业 ,系 统 会 通 知你 这 些 后 台 作 业 是 否 完 成 , 系 统 不 会 中 断 任 何 操 作 , 例 如 编 辑 , 来 通 知 你 一 个 工 作已 经 完 成 。 如 果 你 希 望 某 个 任 务 完 成 时 立 即 通 知 你 , 而 不 管 你 正 在 系 统 中 用 何 种操 作 ,你 可 以 利 用 notify 命 令 来 指 示 系 统 通 知 你 ,notify 命 令 的 参 数 是 作 业 号 。 当这 一 任 务 完 成 时 , 不 管 你 在 做 什 么 , 系 统 都 会 打 断 你 并 通 知 该 任 务 已 完 成 , 下 一 例子 中 告 诉 系 统 当 2 号 任 务 完 成 时 即 通 知 用 户 。

$ notify%2

你 可 以 利 用 前 台 命 令 ,f g ,当 一 个 任 务 自 后 台 取 出 ,如 果 后 台 只 有 一 个 任 务 , 单

独 的 fg 命 令 就 可 将 其 带 到 前 台 ,如 果 后 台 有 多 个 任 务 , 使 用 此 命 令 时 ,你 必 须 加 入任 务 量 。 你 应 将 任 务 量 置 于 fg 命 令 之 后 ,并 在 任 务 量 前 加 一 个 百 分 量 , 下 一 个 例子 中 ,第 二 个 任 务 被 置 入 前 台 。 你 可 能 不 会 立 即 发 现 提 示 符 , 因 为 第 二 个 命 令 正 在前 台 执 行 , 当 这 一 个 命 令 执 行 完 时 , 提 示 符 会 重 新 出 现 , 这 时 候 你 就 可 以 执 行 另 一个 命 令 了 。

$ fg % 2

sat *.c nnyprogs

$

也 有 一 个 bg 命 令 可 以 将 任 务 置 于 后 台 ,这 一 命 令 通 常 用 于 中 断 的 任 务 。 它将 会 ” 中断 ,CTRL- Z ” 中 进 行 简 短 的 讨 论 。

取 消 任 务 :Kill

如 果 你 想 停 止 一 个 正 在 后 台 运 行 的 任 务 , 你 可 以 使 用 Kill 命 令 使 其 强 行 结束 。kill 作 业 号 或 系 统 进 程 号 作 为 其 参 数 。用 户 的 作 业 号 前 必 须 加 % 量 。利 用 jobs 命 令 你 可 以 查 到 作 业 号 。 在 下 一 个 例 子 中 ,jobs 命 令 列 出 了 后 台 的 任 务 , 然 后 任务 2 被 取 消 。

$ jobs

[1] +running /pr intro

[2]-running cat *.c > nnyprogs

$ Kill %2

$

你 也 可 以 利 用 系 统 进 程 号 来 取 消 一 个 任 务 。利 用 ps 命 令 可 得 到 系 统 进 程 号 。ps 命 令 比 jobs 命 令 显 示 了 更 多 信 息 。 在 系 统 管 理 中 将 会 对 之 详 细 讨 论 , 下 一 个例 子 列 出 了 用 户 正 在 运 行 的 进 程 。 PID 是 系 统 进 程 号 ,也 被 称 作 进 程 的 ID 。TTY 是 终 端 识 别 量 。 时 间 是 进 程 被 运 行 的 时 间 长 度 。 Command 是 进 程 的 名 字 。

$ ps

PID

TTY

TIME

COMMAND

523

tty24

0:05

SH

567

tty24

0:01

lpr

570

tty24

0:00

ps

然 后 你 会 可 以 在 K ill 命 令 中 引 用 系 统 进 程 号 。 在 此 进 程 无 须 加 % 号 。 下 一 个例 子 取 消 了 进 程 567

$ Kill 567

中 断 : CTRL-Z

你 可 以 用 CTRL-Z 命 令 中 断 并 停 止 一 个 任 务 。 这 一 命 令 将 任 务 置 于 一 边 直到 任 务 被 重 新 启 动 。 任 务 本 身 并 没 有 结 束 ,它 只 是 被 暂 停 了 , 等 待 你 希 望 它 继 续 进行 的 命 令 。 当 你 准 备 好 后 ,使 用 fg 或 bg 命 令 你 可 以 继 续 进 行 这 一 任 务 。 fg 命 令将 在 前 台 继 续 一 个 中 断 的 任 务 。 bg 命 令 则 将 这 一 任 务 放 入 后 台 执 行 。

有 时 你 需 要 将 一 个 正 在 前 台 运 行 的 任 务 移 至 后 台 。 但 是 , 你 不 能 下 接 将 一 个正 在 执 行 的 例 子 中 , 列 表 并 重 定 同 .C 文 件 的 命 令 首 先 被 用 CTRL-Z 中 断 。 然 后 这一 任 务 被 置 于 后 台 。

$ cat *.c nnyprogs

^ z

$ bg

延 迟 执 行 :at

利 用 at 命 令 , 你 可 以 在 某 一 特 定 的 时 间 执 行 命 令 。 你 可 以 指 定 一 个 你 希 望 命令 执 行 的 时 间 ,而 不 是 立 刻 将 一 个 任 务 放 入 后 台 。 然 后 你 可 以 退 出 ,由 系 统 的 监 视执 行 什 么 命 令 及 何 时 执 行 。

at 命 令 以 你 希 望 命 令 执 行 的 时 间 作 为 参 数 。 时 间 是 一 个 标 识 小 时 的 数 字 以其 后 的 关 键 词 a.m 或 p.m 。 你 也 可 以 加 入 一 个 日 期 。 如 果 未 指 定 日 期 , 系 统 即 认为 当 前 的 日 期 。 然 后 at 命 令 会 从 标 准 输 入 中 输 入 linux 命 令 。 你 可 以 在 键 盘 敲入 上 述 命 令 , 并 以 CTRL-D 来 结 束 标 准 输 入 , 你 也 可 以 把 它 敲 入 一 个 文 件 ,并 将 文件 由 标 准 输 入 重 定 向 到 at 命 令 。 在 下 一 个 例 子 中 , 用 户 决 定 在 4:00 a.m 执 行 一个 命 令 。

$ at 4am lpr iwtro

^ D

$

在 在 下 一 个 例 子 中 ,用 户 将 几 个 命 令 放 入 一 个 latecmds 文 件 中 ,然 后 将 文 件内 容 重 定 向 为 at 命 令 的 输 入 。 at 命 令 将 在 6:00p.w 执 行 这 些 命 令 。

latecmds

lpr intro

cat *.c > nnyprogs

$ at 6pm < letecnnds

你 可 以 有 许 多 方 法 来 标 定 时 间 和 日 期 。 at 命 令 假 定 了 一 个 24 小 时 的 时 间 序列 ,除 非 被 关 键 字 a.m 或 p.m 修 改 。 你 可 以 在 小 时 和 分 钟 之 间 加 入 ” : ”号 来 标 定 小时 中 的 某 一 分 钟 , 例 如 :6:30 。 at 命 令 也 能 识 别 一 些 标 定 某 些 日 期 和 时 间 的 关 键词 。 关 键 词 noon 标 定 的 是 12p.m ,你 可 以 使 用 关 键 词 m idniqht 来 代 替 12a.m 。在 下 一 个 例 子 中 ,用 户 执 行 了 一 个 分 钟 标 定 的 命 令 和 一 个 关 键 词 noon 标 定 的 命令

$ at 8:15pm < latecods

$ at noon < latechds

日 期 可 以 是 一 月 中 的 某 一 天 ,也 可 以 是 一 周 中 的 某 一 天 。 一 月 中 某 日 包 含 着天 数 于 一 个 代 表 月 份 的 关 键 词 。 月 份 可 以 三 个 字 母 由 子 缩 略 词 表 示 。 例 如 , 一 月(January) 被 写 作 jan, 天 数 跟 在 月 份 名 之 后 。 如 果 没 有 月 份 名 , 叫 被 认 为 是 当 前月 。 Feb14 指 明 二 月 十 四 号 ;21 本 身 指 的 是 本 月 的 21 号 。 在 下 一 个 例 子 中 ,用 户首 先 指 定 在 本 月 15 号 执 行 命 令 ,而 后 又 指 定 在 10 月 29 日 执 行 。

$ at 8:15pm 15 < lsteconds

$ at hoon Oct 29 < lsteconds

如 果 你 只 想 在 本 星 期 内 运 行 任 务 ,那 么 , 你 只 需 指 定 星 期 几 。 而 无 须 指 定 月 和日 。 星 期 的 每 天 都 由 其 名 字 表 示 , 这 样 ,敲 入 Tuesday 即 意 味 着 将 在 星 期 二 运 行你 的 任 务 。 你 也 可 以 利 用 today 或 romorrow 这 样 的 关 键 词 来 指 定 日 期 。 在 下一 个 例 子 中 ,用 户 在 周 五 和 明 天 运 行 任 务 。

$ at 8;15 am Friday < latecods

$ at noon tomorrow <latechods

利 用 时 间 或 日 期 , 你 也 可 以 指 定 一 个 增 量 ,例 如 ,你 可 以 指 定 一 个 任 务 在 距 今 天一 周 后 执 行 或 周 五 后 两 个 月 执 行 。 你 可 以 使 用 + 号 跟 着 一 个 指 定 时 间 段 长 短 的 关键 词 来 指 定 增 量 , 时 间 段 关 键 字 有 :m inutes,hours,days, weeks, months, 或 者years 复 数 符 s 可 去 掉 以 表 示 单 一 的 时 间 间 隔 。

例 如 ,在 19 号 后 的 一 个 月 运 行 命 令 ,你 可 以 输 入 19+ month 。 明 天 后 的 一星 期 是 tomorrow+ week 。 今 天 之 后 的 两 周 是 today+2weeks 。 在 下 一 个 例 子中 ,用 户 指 定 在 周 一 后 的 6 周 和 今 后 之 后 的 3 个 月 时 执 行 命 令 .

$ at 8:15pm monday + 6weeks <latecnols

$ at noon today +3months <latecmds

at 有 一 些 选 项 可 以 让 你 列 出 所 有 等 待 执 行 的 at 任务 ,也 可 以 取 消 任 -at 任 务 。每 次 你 执 行 at 命 令 ,你 指 定 以 后 执 行 的 Linux 命 令 都 被 放 入 队 列 并 作 为 一 个 at 作 业 列 出 。 at 命 加 l 选 项 可 以 列 出 所 有 的 at 任务 ,每 一 个 任 务 都 有 一 个 你 可 以 引用 的 编 号 。

$ at -l

732893802 ,a Fri sept 27 20:15:00,1996

732893803,a Fwe sept 24 12:00:00 1996

用 -r 选 项 你 就 可 以 取 消 at 任 务 ,要 取 消 一 个 特 定 的 任 务 ,你 需 要 在 -r 选 项 后 敲入 任 务 编 号 ,在 下 一 个 例 子 中 ,用 户 取 消 at 任 务 732893802,a

$ at -r 732893802 ,a

$ at -l

732893802, a Tue sept 24 12:00:00 1996

通 常 ,at 命 令 不 会 通 知 你 任 务 已 经 执 行 完 毕 , 然而 ,利 用 -m 选 项 ,你 可 以 要 求 当任 务 执 行 完 后 ,用 ma il 通 知 你 ,你 可 以 指 定 接 受 mail 的 一 个 特 定 的 任 务 编 号 。 在下 一 个 例 子 中 ,当 任 务 732893803,a 执 行 完 毕 后 , 将 后 有 ma il 通 知 你

$ at -m 732893803,a

总 结 : shell 操 作

shell 是 用 户 和 操 作 系 统 之 间 提 供 接 口 的 一 个 命 令 解 释 器 。 你 在 命 令 行 上 输入 命 令 ,这 此 命 令 被 shell 解释 , 并 作 为 指 令 送 往 操 作 系 统 ,shell 有 非 常 复 杂 的 特征 ,诸 如 特 殊 字 符 、 重 定 向 、 管 道 、 scipts 和 任 务 控 制 。

shell 有 三 个 特 殊 字 符 ,*,?, [], 它 们 可 以 使 你 产 生 一 系 列 的 文 件 名 作 为 命 令 行上 的 参 数 ,* 号 会 匹 配 所 有 可 能 的 字 符 序 列 ,? 是 会 匹 配 任 意 一 个 字 符 ,[] 匹 配 一 个 字符 集 。 你 甚 至 可 以 利 用 特 殊 字 符 来 组 成 复 杂 的 匹 配 。

在 linux 中 ,文 件 和 设 备 ,以 及 和 命 令 的 输 入 和 输 出 ,都 有 相 同 的 结 构 一 byte 流 , 命 令 的 所 有 输 入 数 据 流 中 , 因 为 标 准 输 入 和 标 准 输 出 同 文 件 有 着 相 同 的 结 构 ,它 们可 以 很 容 易 地 与 文 件 交 互 , 利 用 重 定 向 操 作 符 , 你 可 以 将 标 准 输 入 和 标 准 输 出 指 向一 个 文 件 。 利 用 ”< “ 重 定 向 符 ,你 可 以 将 标 准 输 出 由 一 个 命 令 重 定 向 到 一 个 文 件 。利 用 ”< “ 重 定 向 符 , 你 可 将 标 准 输 入 重 定 向 为 从 一 个 文 件 读 入 , 你 可 以 也 利 用 重 定向 添 加 操 作 符 ”>> “ 将 标 准 输 出 添 加 到 一 个 已 存 的 文 件 中 去 。

既 然 命 令 的 标 准 输 入 和 标 准 输 出 有 着 相 同 的 标 准 格 式 ,你 可 以 很 容 易 地 将 一

个 命 令 的 输 出 作 为 另 一 个 命 令 的 输 入 ,管 道 允 许 你 接 收 一 个 命 令 的 标 准 输 出 ,并 由管 道 将 这 作 为 另 一 个 命 令 的 标 准 输 入 , 在 同 一 个 命 令 行 上 , 你 可 以 串 连 几 个 命 令 , 每 一 个 的 输 入 都 另 一 是 个 命 令 的 输 出 。

使 用 编 辑 器 , 你 可 发 创 建 一 些 包 含 shell 命 令 和 变 量 定 义 的 文 件 。 这 些 文 件被 称 作 shell scripts ,。 shell scripts 甚 至 有 参 数 变 量 ,它 们 将 从 命 令 行 上 接 收 参数 ,通 过 设 置 shell script 的 执 行 许 可 ,你 可 以 把 shell script 的 各 字 当 作 shell 命 令 对 待 。

你 在 shell 中 也 可 以 定 义 变 量 变 对 其 赋 值 。 在 变 量 名 前 加 $ ,你 可 以 就 引 用 一个 变 量 。 你 可 以 把 变 量 作 为 命 令 参 数 使 用 。 它 们 可 以 包 含 目 录 络 经 名 或 者 要 执行 的 命 令 。

当 你 执 行 一 个 命 令 时 ,它 被 Linux 当 作 一 个 要 执 行 的 任 务 。 你 可 以 指 示 Linux 在 后 台 执 行 任 务 , 以 使 你 执 行 其 它 命 令 , 将 后 台 操 作 符 放 于 命 令 行 末 尾 会 指 示Linux 在 后 台 执 行 这 一 命 令 。 用 jobs 命 令 可 列 出 你 在 后 台 的 任 务 。 用 fg 命 令 , 你 可 将 一 个 任 务 由 后 台 移 至 前 台 。 你 可 以 用 kill 命 令 来 终 止 后 台 任 务 , 或 用CTRL-8 命 令 来 中 断 任 务 。

标 准 错 误 /重 定 向 符 号

5-1 shell 符 号

执 行

ENTER

执 行 一 个 命 令 行

;

在 同 一 命 令 行 中 分 隔 命 令

'命令 '

*

? []

\

>

执 行 一 条 命 令

匹 配 文 件 名 中 的 任 何 符 集匹 配 文 件 名 中 的 单 个 字 符

匹 配 文 件 名 中 的 可 能 的 字 符 集

引 用 紧 跟 的 字 符 ,用 于 引 用 特 殊 字 符将 标 准 输 出 重 定 向 回 到 文 件 或 设 备 。

如 文 件 不 存 后 ,则 创 建 新 文 件 ;如 文 件

已 存 在 ,履 盖 该 文 件 假 设 文 件 存 在 ,则 强制 进 行 履 盖 , 掩盖 noclobber 选 项

< 将 标 准 输 入 重 定 向 为 由 文 件 或 设 备 强 程序

>> 将 标 准 输 出 重 定 向 到 一 个 文 件 或 设 备 ,

将 输 出 添 加 到 文 件 尾

l 将 一 个 命 令 的 标 准 输 出 由 管 道 作 为 另 一命 令 的 输 入

& 在 后 台 执 行 命 令

! 历 史 命 令

2> 将 标 准 错 误 重 定 向 到 一 个 文 件 或 设 备

2>> 将 标 准 错 误 重 定 向 并 添 加 一 个 文 件 或 设备

2>&1 将 标 准 错 误 重 定 向 标 准 输 出

1& 将 标 准 错 误 由 管 道 作 为 另 一 命 令 的 输 入

>& 把 标 准 错 误 重 定 向 到 一 个 文 件 或 设 备

5-2 shell 操 作

命 令

ENTER

执 行

执 行 了 一 个 命 令 行

在 同 一 命 令 行 上 分 隔 命 令

commard \opts args

在 回 年 之 前 键 入 后 斜 杠 以 复 在 另 一 命

令 行 继 续 输 入

命 令

'commerel'

执 行 一 个 命 令

BACKSPCE

CTRL-H

删 除 前 一 个 字 符

CTRL-U

删 除 命 令 行 并 重 新 开 始

CTRL-C

中 断 并 停 止 一 个 命 令 的 执 行

文 件 名 Gerererion

执行

的 特 殊 字 符

*

匹 配 任 何 字 符 集

?

匹 配 任 何 单 个 字 符

[] 匹 配 可 能 的 字 符 集

\ 引 用 跟 的 字 符 。 用 于 引 用 特 殊 字 符

重 定 向 执行

command.>filnemme 将 标 准 输 出 重 定 向 到 一 个 文 件 或 设 备

commane <filnemme 将 标 准 输 入 重 定 向 到 一 个 文 件 或 设 备commane>>filerane 将 标 准 输 出 添 加 到 一 个 文 件 末 尾commane>!filerane 在 C-Shell 和 K-Shell 中 , 强 制 写 入 一 个

已 存 在 的 文 件

commane2>filerane B-Shell 中 ,将 标 准 错 误 重 定 向 到 某 文 件commane2>>filerane B-Shell 中 ,将 标 准 错 误 添 加 到 文 件 末 尾commane2>&1filerane B-Shell 中 ,将 标 准 错 误 重 定 向 到 标 准 输 出commane>&filerane C-Shell 中 ,将 标 准 错 误 重 定 向 到 文 件

管 道 执 行

管 道 | 管 道 把 一 个 命 令 的 输 出 当 作 另 一 个 命 令 输 入

管 道 | & 管 道 执 行 TCSH-Shell 中 ,把 标 准 错 误 作 为 另 一个 命 令 输 入

后 台 任 务 执 行

& 后 台 执 行 任 务

fg % jobnum 将 后 台 的 命 令 放 入 前 台 或 继 续 被 中 断 的 程 序

bg 将 前 台 的 命 令 放 入 后 台

CTRL-Z 中 断 并 停 止 以 后 正 运 行 的 程 序 ,程 序 在 将 之 继续 之 前 保 持 信 止 和 等 待 状 态

notify % jobnum 将 任 务 结 束 时 通 知 用 户

kill % jobnum 取 消 并 结 束 在 后 台 运 行 的 任 务

kill processnum

jobs 列 出 所 有 后 台 任 务 , 除 非 使 用 jsh shell, 否则在 Boune shell 中 不 存 在

ps 列 出 包 括 的 后 台 任 务 在 内 的 所 有 在 运 行 的 进 程

at time date 在 某 一 特 定 的 时 间 和 日 期 执 行 命 令 ;tim e 可 用 分

钟 和 小 时 输 入 ,并 由 am 和 pm 加 以 限 定

hour: m inutes am pm

日 期 可 用 一 日 或 一 周 中 某 天 确 定

mpnth day

month 可 由 三 字 因 缩 略 词 表 示

3 am, Feb etc day 是 由 名 字 表 示

monday Tuesday wedanesday ,etc

可 利 用 关 键 词 业 来 标 识 日 期 和 时 间

am, pm., how, hoon , midnighi goday, tomorrow

你 可 利 用 + 操 作 符 由 某 一 天 或 时 间 增 加 一 个 时

间 段 。 + 操 作 符 之 后 数 字 标 明 时 间 段 的 个 数

date + nuw time - segmelt time - segmeut 可 以 是

hours minutes days weeks months years

关 键 是 keyword 从 现 在 时 间 增 加 一 个 时 间 段

wext time -- segnert next week

选 项

  1. jobnum ( 列 出 现 有 的 at 任 务 ) r jobnum (取 消 一 个 任 务 )

  2. jobnum (任 务 结 束 时 用 mail 进 行 通 知 )