为什么要捕获命令行输入和输出?
许多命令行UNIX和Linux®命令的联机参考信息(手册页)是有关这些命令的信息的主要来源。 所有手册页都应解释给定命令可用的所有选项,并且许多手册页都提供了相关程序输出的示例,包括任何程序提示和相关的用户输入。
要获取此信息,必须有人创建这些示例。 读取源代码以查看对用户的所有可能提示及其显示的场景通常比简单地运行程序以查看其功能要少。 为了将该实验转换为文档,开发人员(或为应用程序创建参考信息的作者)发现,保留完整的程序输入记录,应用程序显示的信息提示以及响应这些提示的用户输入很有用。 。
捕获用户与命令行应用程序的交互不仅仅是编写任务。 大多数命令行应用程序开发人员都将C编程语言的printf()
命令(或其他语言的等效命令)用作其初始调试工具,并使用它来显示整个应用程序中不同变量和数据结构的内容。 根据显示的信息量,通常最简单的方法是将该输出捕获到文件中以进行后续检查和分析。 同样,系统管理员通常喜欢保留交互式系统或服务器配置和初始化的分步记录。
本文的下一部分将探讨捕获用户与命令行应用程序交互的各种方式,从使用所有UNIX和Linux Shell中包含的功能到使用特定工具自动捕获此类信息。
捕获输出和错误消息
UNIX和Linux系统使用在那些系统上使用的命令解释器中内置的功能(称为shell) ,可以轻松地在单独的文件中捕获程序输出和错误。 这些功能称为Shell重定向 ,使用户可以使用尖括号字符或者将程序输出(称为标准输出或stdout传递给它的朋友)和程序错误输出(称为Standard error或stderr )重定向到特定文件或其他目标。数字标识符。 不同的shell使用略有不同的语法来捕获程序输出和错误消息,如下表所示:
- 将
ls
程序的标准输出写入/ bin / sh,/ bin / bash,/ bin / csh和/ bin / ksh shell中的file1文件:ls > file1
- 将
ls
程序的错误输出写入/ bin / sh,/ bin / bash,/ bin / csh和/ bin / ksh shell中的file1文件:ls 2> file1
(如果使用/ bin / csh shell,没有简单的方法将错误消息仅重定向到文件。)
- 将
ls
程序的标准输出和错误输出写入/ bin / sh,/ bin / bash,/ bin / csh和/ bin / ksh shell的file1文件中:ls &> file1
- 在/ bin / sh,/ bin / bash和/ bin / ksh shell中,将
ls
程序的标准输出写入file1文件,并将此命令的错误输出写入file2文件:ls 1> file1 2> file2
Shell重定向可以方便地捕获标准程序输出,程序错误消息或同时捕获到文本文件。 但是,如果您真正想做的只是捕获用户与程序的交互,这还不够。 为此,您可以利用外壳程序的交互功能和称为管道的其他类型的输出重定向。
使用交互式外壳捕获程序交互
上一节显示了如何将用户交互的特定方面写入特定文件,如果您试图捕获调试输出,程序使用信息等,这将很有帮助。 但是,如果你在写文档,应用程序或干脆保持使用或与应用实验的记录,你想看到你提供什么输入到程序(的所谓的标准输入或stdin的一个例子),以及应用程序对该输入的React。 本文的最后两部分讨论了为此目的设计的一些应用程序。 本节重点介绍如何仅使用自己喜欢的shell,另一种称为管道的shell重定向以及称为tee
的标准UNIX或Linux实用程序来执行此操作。
在UNIX和Linux外壳程序中,管道由“ |
”符号表示,并将一个命令的标准输出连接到另一个命令的标准输入。 如果您熟悉各种管道连接器,则UNIX或Linux tee
应用程序会按照其名称建议的方式工作-将其输入分为两个不同的流。 其中一个保留为标准输出,另一个保留为您在命令行上指定名称的文件。 因此,您可以使用管道和tee
命令的组合来组合将程序的输出重定向到文件中并查看该输出。 例如,以下命令显示ls /etc
命令的输出,并在ls.out文件中捕获该命令的标准输出:
ls /etc | tee ls.out
您还可以使用“ |&
”字符通过命令行上的管道重定向标准错误和标准输出。 例如,以下命令同时显示ls /etc
命令的输出和所有错误消息,并使用tee
命令在ls.out文件中捕获输出和错误消息:
ls /etc |& tee ls.out
您可以通过管道, tee
命令和您最喜欢的shell的交互模式结合标准输出和标准错误的重定向,以使用以下命令将所有输入,输出和错误消息捕获到文件中:
bash -i |& tee output_file.txt
此命令以交互方式执行Bash shell,这意味着它实际上是可以与之交互的shell,直到您明确终止它为止。 该命令使用“ |&
”字符将该外壳程序的所有输出和错误消息重定向到tee
命令,该命令既显示所有输出和错误消息,又将所有内容的副本保存到output_file.txt文件。 完成要捕获其交互的任何命令后,可以键入exit
命令(或大多数系统上的Control-d组合键)以终止外壳。 output_file.txt文件包含您键入的任何内容,运行的程序的所有输出以及这些命令显示的任何错误消息的完整记录,与执行这些命令时的样子完全相同。
使用script
命令
虽然UNIX和Linux命令,例如bash -i |& tee output_file.txt
并没有那么复杂,但是键入它们可能很麻烦,请记住正确的“ |
”和“ &
”字符顺序,记住tee
命令等等。 在大多数UNIX和Linux系统上可用的一种简单得多的解决方案是script
命令,它可以为您完成所有这些工作。 script
命令启动一个子外壳,并将您键入的所有内容,所运行的任何程序的所有输出以及这些程序生成的任何错误的副本保存到输出文件。 如果未指定要用于保存所有内容的文件的名称,那么script命令会创建一个名为typescript的文件,但是您也可以在命令行上指定要写入的文件的名称。 例如,以下命令将捕获您键入的所有内容,所有程序输出以及所有错误消息到output_file.txt文件:
script output_file.txt
与使用交互式外壳程序类似,如上一节所述,您可以退出script
命令并通过键入exit
命令(或大多数系统上的Control-d组合键)关闭其输出文件。
如果将上一节中讨论的交互式shell机制生成的输出文件的内容与使用script
命令生成的输出文件的内容进行比较,您会立即注意到script
命令生成的文件通常包含控制字符,例如退格键,返回,用于显示特殊提示的特殊字符,以及在编辑先前的Shell命令时使用的字符。 script
命令创建的输出文件包含这些字符,因为它们包含您键入的所有内容的准确记录,而不是shell对其解释的方式。 使用上一部分中讨论的交互式shell机制生成的输出文件不包含这些字符,因为它们包含在处理了诸如退格键和return之类的控制字符之后最终转发到shell的内容。
使用您喜欢的文本编辑器清理脚本输出文件非常容易,并且网上有多种清理脚本。 我最喜欢的清除机制来自Perl Monks网站,它结合了简单的Perl命令以及标准的UNIX和Linux col
命令,该命令从输入中过滤掉控制字符,以清除script
命令产生的输出文件。 例如,要创建名为output_file.txt的脚本输出文件的名为output_file.txt.clean的纯副本,请执行清单1所示的命令。
清单1.清理脚本输出
cat output_file.txt | \
perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' |\
col -b > output_file.txt.clean
如果经常执行此类操作,则可能需要创建一个小的Shell脚本来自动执行此过程,以防万一在第二行中键入Perl替换命令时遇到了麻烦。 清单2是执行此操作的简单shell脚本。
清单2.用于清理脚本输出的shell脚本
#!/bin/bash
if [ $# -ne 2 ] ; then
echo "Usage: cleanup script-file output-file"
exit
fi
cat $1 | \
perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' |\
col -b > $2
Shell重定向,上一节中讨论的交互式shell命令以及本节中讨论的script
命令都是捕获程序交互的所有机制,几乎可以在每个UNIX和Linux系统上使用。 但是,某些UNIX系统提供了用于捕获程序交互的其他工具。 这些工具提供了在特殊情况下有用的附加功能,如下一节所述。
特定于平台的文本捕获实用程序
大多数UNIX和Linux系统仅提供script
命令来自动捕获程序交互,但是AIX操作系统提供了一个方便的实用程序,巧妙地称为capture
,使您能够将特定屏幕上的文本值写入文件。 当您想显示运行操纵屏幕的命令的示例(例如文本编辑器)时,这很有用。 尝试捕获一个使用vi
编辑器通过shell重定向或script命令创建文件的示例,该示例将创建一个包含许多控制字符且实质上难以理解的输出文件。
如果未在命令行上指定要写入的特定文件的名称,那么AIX capture
命令将创建一个名为screen.out的文件。 启动capture
命令将创建一个外壳程序,您可以在其中执行所需的任何命令,直到屏幕上准确显示要捕获的内容为止。 此时,键入Control-p组合键会将屏幕内容写入输出文件。 要终止捕获命令,只需键入exit
命令(或在大多数系统上输入Control-d )。
使用capture
命令时,请务必记住,除非您键入Control-p ,否则它不会捕获屏幕上的文本,并且多次键入Control-p只会覆盖输出文件,除非您使用-a
启动捕获命令。选项告诉它追加到输出文件而不是覆盖它。
摘要
捕获与程序的交互是一项令人惊讶的常见任务。 尽管UNIX和Linux外壳提供了用于将交互的特定部分写入文本文件的内置机制,但是使用交互式外壳或script
命令会生成单个输出文件,这些文件提供了程序交互的完整顺序记录。 对于几乎所有UNIX或Linux编写者,开发人员或系统管理员而言,生成这些输出文件(并在必要时进行清理)的机制都是有用的工具。
本系列的下一篇文章将讨论用于捕获图像的标准工具,这些图像可以显示整个屏幕或UNIX和Linux系统上的特定窗口。 它还将说明如何将这些图像转换为各种标准图形格式。
翻译自: https://www.ibm.com/developerworks/aix/library/au-screenshots1/index.html