当前位置: 首页 > 科技观察

Linux中的输入、输出和错误重定向

时间:2023-03-14 16:02:55 科技观察

如果您熟悉基本的Linux命令,您还应该了解输入和输出重定向的概念。我们都知道Linux命令的作用,它接受输入并为您提供输出。这里有一些重要的角色,我们今天将介绍这些角色。stdin、stdout和stderr当你运行一个Linux命令时,有三种数据流在其中工作:stdin:(标准输入,标准输入)是输入数据的来源。默认情况下,stdin是从键盘输入的任意文本,其流ID(streamID)为0;stdout:(标准输出,标准输出)是命令的输出。默认情况下,它会显示在屏幕上,它的流ID(streamID)为1;stderr:(标准错误,标准错误)是命令产生的错误信息(如果有的话)。默认情况下,stderr也会显示在屏幕上。它的流ID(streamID)是2。这些流包含存储在缓冲存储器中的明文数据。把它想象成水流,你需要一个水源,比如水龙头,用管道连接它,你可以把它储存在桶里(文件),你可以给你的植物浇水(打印)。如果需要,它也可以连接到另一个水龙头,即改变水流方向(重定向)。Linux中也有重定向这个概念。您可以将stdin、stdout和stderr从它们的原始目的地重定向到另一个文件或命令(甚至是像打印机这样的外围设备)。让我们来看看重定向是如何工作的,以及如何使用它。输出重定向第一种也是最简单的重定向形式是输出重定向,也称为标准输出重定向。默认情况下,命令的输出显示在屏幕上。比如我使用ls命令列出当前目录下的所有文件:[gliu@fedorawork]$lsappstxtnew.txtstatic-ip.txt通过输出重定向,可以将输出重定向到一个文件中。如果此输出文件不存在,shell将创建它。command>file比如我们把上面ls命令的输出保存到一个名为output.txt的文本文件中:[gliu@fedorawork]$ls>output.txt输出文件是预先创建的,所以输出的内容.txt文件是什么?我们用cat命令来看一下:[gliu@fedorawork]$catoutput.txtappstxtnew.txtoutput.txtstatic-ip.txt你有没有注意到它也包含了output.txt?将输出重定向到(output.txt)的文件是在运行预期命令之前创建的。为什么?因为它需要一个准备好输出的目的地,所以输出将被发送到那个目的地。添加而不是删除一个经常被忽视的问题是,如果您重定向到一个已经存在的文件,shell将首先删除该文件。这意味着输出文件的现有内容将被删除并替换为命令的输出。如果不想删除原来的内容,只想追加,可以使用>>重定向语法:command>>file可以在当前shell会话中禁用删除,使用set-C将输出重定向到一个文件,可以将输出的内容保存起来,以备后用;另外,如果输出内容过多,占用屏幕较大,将内容保存到文件中,更方便查看和分析,就像收集日志文件一样。管道重定向在介绍stdin重定向之前,我们先了解一下管道重定向,它比较常见,我们也会经常用到管道重定向。关于管道重定向,可以参考我们之前的文章:Linux中的管道是什么?管道重定向如何工作?使用管道重定向,您可以将一个命令的标准输出发送到另一个命令的标准输入。命令1|command2举个例子,如果我们想查看当前目录下的文件个数,可以使用ls-1(注意是数字1,不是字母L)来显示当前目录下的文件:[gliu@fedorawork]$ls-1appstxtnew.txtoutput.txtstatic-ip.txt我们知道wc命令是用来统计文件行数的,所以我们可以这样组合这条命令:[gliu@fedorawork]$ls-1|wc-l4使用管道,其中两个命令共享同一个内存缓冲区,第一个命令的输出存储在缓冲区中,然后用作下一个命令的输入。您将看到管道中最后一个命令的结果。这是显而易见的,因为前一个命令的标准输出被重定向到下一个命令,而不是打印到屏幕上。管道重定向或管道不限于只连接两个命令,您还可以连接多个命令,只要一个命令的输出可以用作下一个命令的输入即可。command_1|command_2|command_3|command_4注意stdout/stdin是一段数据,不是文件名一些Linux新手在使用重定向时会感到困惑,如果一个命令返回一组文件名作为输出,这些文件不能被name用作一个参数。例如,如果使用find命令查找扩展名为.txt的文件,则不能通过管道将找到的文件移动到新目录。你不能这样做:找到.-typef-name"*.txt"|mvdestination_directory这就是为什么我们经常看到find命令与exec或xargs命令结合使用的原因。这些命令可以将大量文本“文件名”转换为文件名,并且可以作为参数传递。寻找。-typef-name"*.txt"|xargs-t-I{}mv{}../new_dir关于find和exec或者xargs命令的组合可以参考我们之前的文章:find和exec命令的组合是一个强大的搜索工具如何使用xargsLinux中的命令输入重定向使用stdin重定向将文本文件的内容传递给终端命令:commandcount.txt有时重定向错误,当你运行一些命令或脚本时,你会在屏幕上看到错误信息:[gliu@fedorawork]$ls-lffffff>output.txtls:cannotaccess'ffffff':这篇文章中没有这样的文件或目录一开始我们提到了三个数据流,stderr是其中之一,它默认将输出显示在屏幕上。您还可以重定向stderr。由于它是输出数据流,因此可以使用与标准输出重定向相同的>或>>重定向符号。但是,当stdout和stderr都是输出流时,如何区分它们呢?通过它们的流ID(流ID,也称为文件描述符)。数据流流IDstdin0stdout1stderror2-t-list-u-update-x–extract,–get-j–bzip2-z–gzip,–gunzip,–ungzip在使用输出重定向符号时默认>其实是1>。也就是说这里输出的是ID为1的流。所以当你想重定向stderr时,你可以使用它的ID,比如2>或2>>。这表明输出重定向是针对流stderr(ID2)的。stderr重定向示例让我们举几个例子。如果我们只想保存错误信息,可以这样:[gliu@fedorawork]$lsfffff2>error.txt[gliu@fedorawork]$caterror.txtls:cannotaccess'fffff':Nosuch文件或目录这个很简单。让我们做一个稍微复杂一点(也有用)的:[gliu@fedorawork]$ls-lnew.txtffff>output.txt2>error.txt[gliu@fedorawork]$catoutput.txt-rw-rw-r--1gliugliu0May510:25new.txt[gliu@fedorawork]$caterror.txtls:cannotaccess'ffff':Nosuchfileordirectory在上面的例子中,ls命令尝试显示信息关于两个文件。其中一个文件成功,另一个失败。所以我在这里所做的是将stdout输出重定向到output.txt文件,并将stderr重定向到error.txt(使用2>)。此外,我们可以将stdout和stderr重定向到同一个文件,有一种方法可以做到这一点。在下面的示例中,我使用追加模式将stderr重定向到文件combined.txt(使用2>>);然后,同样使用append模式将标准输出stdout重定向到同一个文件combined.txt中(使用>>):[gliu@fedorawork]$ls-lnew.txtfff2>>combined.txt>>combined.txt[gliu@fedorawork]$catcombined.txtls:cannotaccess'fff':Nosuchfileordirectory-rw-rw-r--1gliugliu0May510:25new.txt另一种方法,也是首选方法,是使用类似2>&1的东西,它大致翻译为“将stderr重定向到与stdout相同的地址”。让我们以前面的例子为例,这次使用2>&1将stdout和stderr重定向到同一个文件:[gliu@fedorawork]$ls-lnew.txtfff>output.txt2>&1[gliu@fedorawork]$work]$catoutput.txtls:cannotaccess'fff':Nosuchfileordirectory-rw-rw-r--1gliugliu0May510:25new.txt这里需要注意的一点是不能取理所当然地认为2>>&1是追加模式,因为2>&1本身就是追加模式。或者,您可以先使用2>然后使用1>&2将stdout重定向到与stderr相同的文件。基本上,>&将一个输出流重定向到另一个。总结一下1)一共有三个数据流,其中一个是输入数据流stdin(0),两个输出数据流是stdout(1)和stderr(2);2)键盘输入为默??认标准输入设备,屏幕为默认输出设备;3)输出重定向使用>或>>(用于追加模式);4)输入重定向使用<;5)stderr可以使用2>或2>>;6)stderr和stdout可以合并为:2>&1。至此我们已经了解了重定向,所以为了更深入的学习,我们还可以了解一下tee命令,它可以将数据显示到标准输出,同时保存到文件中。后面我们会分享这个命令的用法。以上就是本次分享的全部内容,欢迎讨论。