13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

exit}这 个 方 法 的 一 个 常 见 的 应 用 就 是 当 你 想 从 一 个 命 令 打 开 一 个 管 道 的 时 候 绕 开 shell。 你 想 这么 干 的 原 因 可 能 是 你 不 希 望 shell 代 换 任 何 你 准 备 传 递 命 令 过 去 的 文 件 名 里 的 元 字 符 吧 。如 果 你 运 行 <strong>Perl</strong> 5.6.1 或 者 更 新 的 版 本 , 你 可 以 利 用 open 的 多 参 数 形 式 获 取 同 样 的 结果 。使 用 分 裂 的 文 件 打 开 的 原 因 是 为 了 在 一 个 假 想 的 UID 或 GID 下 也 能 打 开 一 个 文 件 或 者命 令 。 你 fork 出 来 的 子 进 程 会 抛 弃 任 何 特 殊 的 访 问 权 限 , 然 后 安 全 地 打 开 文 件 或 者 命 令 ,然 后 充 当 一 个 中 介 者 , 在 它 的 更 强 大 的 父 进 程 和 它 打 开 的 文 件 或 命 令 之 间 传 递 数 据 。 这 样 的例 子 可 以 在 第 二 十 三 章 的 “ 在 有 限 制 的 权 限 下 访 问 命 令 和 文 件 ” 节 找 到 。分 裂 的 文 件 打 开 的 一 个 创 造 性 的 用 法 是 过 滤 你 自 己 的 输 出 。 有 些 算 法 用 两 个 独 立 的 回 合 来 实现 要 远 比 用 一 个 回 合 实 现 来 得 简 单 。 下 面 是 一 个 简 单 的 例 子 , 我 们 通 过 把 自 己 的 正 常 输 出 放到 一 个 管 道 里 模 拟 Unix 的 tee(1) 程 序 。 在 管 道 的 另 外 一 端 的 代 理 进 程 ( 我 们 自 己 的 子过 程 之 一 ) 把 我 们 的 输 出 分 发 到 所 声 明 的 所 有 文 件 中 去 。tee("/tmp/foo", "/tmp/bar", "/tmp/glarch");while() {print "$ARGV at line $. => $_";}close(STDOUT)or die "can't close STDOUT:$!";sub tee {my @output = @_;my @handles = ();for my $path (@output) {my $fh;# open 会 填 充 这 些429

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!