Shell 实践 - Redirection 入门
如果您正在阅读本刊物,您已经知道 Linux 是当今最强大和最通用的操作系统之一。如果您像我一样是个老手,您也了解命令行以及通过键入命令而不是单击图标为勤奋用户带来的极客复古乐趣。然而,如今,Linux 之上的图形界面设计得如此出色,以至于——虽然我觉得有点令人费解——很多 Linux 用户从不接近命令行。
这太可惜了。命令行非常强大,命令通过管道连接在一起以创建自定义命令序列的底层隐喻意味着 Linux 实际上提供了数百万种独特的方式来使用系统。但是,是的,确实存在一个学习曲线需要克服。
然而,不仅仅是命令行,事实证明,shell 通过我们称之为 shell 脚本编程的东西提供了一个简单且出奇强大的编程环境。在 UNIX 术语中,shell 是命令行界面或 CLI。无论哪种方式,它都是接收您键入的命令并实际执行您请求的任何操作的程序。将一堆这些命令串在一起,将它们放在一个文件中,您就得到了一个 shell 脚本——简单明了。
这就是我将在《Linux Journal》的新专栏中讨论的内容,并且对于人群中的那些超级极客发出警告,我将放慢速度,并确保我们在进入复杂的脚本编写技巧和技术之前涵盖所有基本概念。
首先,请允许我简要介绍一下自己。我最早在 1980 年登录到 BSD UNIX 系统,从那时起就一直参与 UNIX,然后是 Linux 系统。我曾在开放软件基金会工作,帮助管理 Usenet 层次结构,是旧 UUCP 时代的 hplabs 的邮局主管之一,并且作为 The Elm Mail System 的作者而广为人知。我写了 19 本书,其中最著名的是 24 小时自学 Unix 和畅销书 Wicked Cool Shell Scripts。我为各种 UNIX 和 Linux 发行版贡献了软件,包括发布时的 BSD 4.4,而且无论我正在做什么,我的计算机上仍然有一个打开的终端窗口。我迷上了命令行,我还能说什么呢?
首先,让我们讨论 Linux 命令行最重要的概念之一:标准输入和输出。当您运行像ls列出文件或date查看日期和时间(可悲的是,后一个命令无助于您获得社交生活。如果事情如此简单就好了!),事实证明该程序实际上有一个输入通道和两个输出通道。对于这些命令,输入通道被忽略,因为它们实际上不从所谓的输入流中读取输入,但它们确实同时具有输出和错误输出流。这三个流称为标准输入(或 stdin)、标准输出(或 stdout)和标准错误(或 stderr)。为什么这很重要?因为您可以将它们中的任何一个重定向为来自文件或转到文件——对于任何 Linux 命令。
假设您要创建一个名为 rightnow 的新文件,并且您希望它包含当前日期和时间。这是它在命令行上的样子
date > rightnow
很简单。然而,一个重要的警告是,如果您指定的输出文件已经存在,默认情况下 Linux 会静默地覆盖它,这并非不经常导致诅咒、极大的挫败感和不愉快的用户。请小心(或在您最喜欢的命令 shell 的手册页中查阅 noclobber)。
假设您想在文件中保存两次日期。现在,不是创建一个新文件,而是将新内容添加到文件的现有内容中。这是通过以下方式完成的
date >> rightnow
现在检查文件,您将看到两个时间/日期戳,相隔几秒钟。
让我们在列表中添加另一个有用的命令 wc,它计算指定文件或 stdin(标准输入流)中的字符、单词和行数。首先,date 命令的标准输出中有多少字符、单词和行?
$ date > test $ wc test 1 6 29 test
典型的 Linux 晦涩输出:第一个值是行数,第二个值是单词数,第三个值是字符数。让我们也尝试一下这种变体
$ wc < test 1 6 29
请注意,这次我们没有让 wc 命令打开我们指定名称的文件,而是使用重定向将 stdin 替换为指定文件的内容。这就是为什么 wc 输出不显示文件名;它不知道输入来自文件。
在我们结束这次快速浏览之前,让我们再考虑一个文件重定向。我们已经看到了 > 和 >> 和 <。您认为如果您使用 << 作为文件重定向会发生什么?啊,嗯,这是一个棘手的问题,因为它不会附加任何内容,它可以让您在不实际涉及文件的情况下模拟文件重定向。实际上,<< 被称为“here document”(此处文档),因为当以 << EOF 的标准形式使用时,它被解读为“读取直到到达‘此处’”(EOF 序列)。通过一个例子,这将更容易理解
$ wc << EOF > this is a simple test and should > show you how many lines, words > and characters are in this little > input sequence. > EOF 4 21 114
现在你可以理解 wc 的输出开始变得有意义了:四行,21 个单词和 114 个字符。自己数数看!另外,请注意行首的 > 符号是由 shell 自动添加的续行符,用于告知您需要更多输入。一旦到达此处文档的末尾,就会出现 EOF 序列,输入流被馈送到指定的命令,wc 会忠实地计数行数、单词数和字符数。
这个月的基础知识应该足够我们入门了。下个月,我们将探讨如何创建命令管道,其中一个命令的输出是下一个命令的输入,然后开始讨论我为本专栏制定的长期 shell 脚本编程项目:一个基本的二十一点游戏。
Dave Taylor 是一位拥有 25 年 UNIX 经验的资深人士,The Elm Mail System 的创建者,并且是畅销书《Wicked Cool Shell Scripts》和《Teach Yourself Unix in 24 Hours》等 16 本技术书籍的作者。他的主要网站是 www.intuitive.com。