Linux中什么是重定向-linux重定向和管道

2023-04-23 18:28:25

 

在linux中什么是文件的重定向?重定向和管道是shell的一种高级特性,这种特性允许用户人为地改变程序获取输入和产生输出的位置。

什么是重定向?

重定向就是将数据传到其他地方。具体地说:将应该出现到屏幕上的数据,传送到其他设备,例如,文件或者打印机。

Linux 中的I/O重定向简单来说就是一个过程,这个过程捕捉一个文件或者命令、程序、脚本,甚至脚本中的代码块(code block)的输出,然后把捕捉到的输出,作为输入发送给另外一个文件、命令、程序或者脚本。I/O重定向中的文件标识符(File Descriptor)的概念,系统为每一个打开的文件指定一个文件标识符以便对文件进行跟踪,这有些和C语言编程里的文件句柄相似,文件标识符是一个数字,不同数字代表不同的含义,默认情况下,系统占用了3个,分别是0标准输入(stdin)、1标准输出(stdout)、2标准错误(stderr),另外3~9是保留的标识符,可以把这些标识符指定成标准输入、输出或者错误作为临时连接。通常这样可以解决很多复杂的重定向请求。

什么是输入的重定向?

和标准输出类似,程序默认情况下接收输入的地方被称为标准输入(stdin)。通常来说,标准输入总是指向键盘。例如,如果使用不带任何参数的cat命令,那么cat会停在那里,等待从标准输入(也就是键盘)获取数据。

#cat

用户的每一行输入会立即显示在屏幕上,直到使用组合键ctrl+D提供给cat命令一个文件结束符。

Hello

Bye

<ctrl+D> //这里按下<Ctrl+D>组合键

通过使用输入重定向符号“<”可以让程序从一个文件中获取输入。

#cat< cxw

Hello

Hi

How are you

上面这条命令将文件cxw作为输入传递给cat命令,cat读取cxw中的每一行,然后输出读到的内容。最后当cat遇到文件结束符时,就停止读取操作。整个过程同先前完全一致。

正如读者已经想到的,cat命令可以通过接受一个参数来显示文件内容,因此“cat<cxw”完全可以用cat cxw来替代。事实上,大部分命令都能够以参数的形式在命令行上指定输入档的文件名,因此输入重定向并不经常使用。

另一种输入重定向的例子被称为立即文档(here document),这种重定向方式使用操作符“<<”。立即文档明确告诉shell从键盘接受输入,并传递给程序。如:

#cat << EOF

>Hello

>Bye

>EOF

Hello

Bye

Cat命令从键盘接受两行输入,并将其送往标准输出。立即文档指定了一个代表输入结束的分隔符(EOF),当shell遇到这个单词的时候,即认为输入结束,并把刚才的键盘输入一起传递给命令。所以这次cat命令会将用户的输入一块显示,而不是每收到一行就迫不及待地把它打印出来。

用户可以选择任意一个单词作为立即文档的分隔符,像EOF、END、eof等都是不错的选择,只要可以确保它不是正文的一部分。

那输入重定向和输出重定向结合在一起会是怎样的呢?

#cat <<END>hello

>Hello World!

>Bye

>END

这条命令首先让cat命令以立即文档的方式获取输入,然后再把cat的输出重定向到hello文件。查看hello文件,应该可以看到下面这些内容。

Hello World!

Bye

什么是输出重定向?

程序在默认情况下输出结果的地方被称为标准输出(stdout)。通常来说,标准输出总是指向显示器。例如下面的ls命令获取当前目录下的文件列表,并将其输出到标准输出,于是用户在屏幕上看到了这些文件名。

#ls

Bin cdrom etc initrd initrd,img,old lib32 lost+dound mnt proc

输出重定向用于把程序的输出转移到另一个地方去。下面这条命令将ls的输出重定向到ls_out文件中。

#ls > ~/ls_out

这样,ls的输出就不会在显示器上显示出来,而是出现在用户主目录的ls_out文件中,每一行显示一个文件名。

#cat ~/ls_out

bin

boot

cdrom

……

如果ls out文件不_存在,那么输出重定向符号“>”会试图建立这个文件。如果ls_out文件已经存在了,那么“>”会删除文件中原有的内容,然后用新内容替代。

#uname -r > ls_out

#cat ls_out

2.6.24 -21-generic

可以看到,“>”并不会礼貌地在原来那堆文件名的后面添上版本信息,而是直接覆盖了。如果要保留原来文件中的内容,应该使用输出重定向符号“>>”。

#date > date_out //将date命令的输出重定向到date_out文件

#cat date_out //查看date_out文件的内容

2022年06月01日 星期三 8:00:00 CST

#uname -r >> data_out //将uname命令产生的版本信息追加到date_out文件的末尾

#cat date_out

2022年06月01日 星期三 8:00:00 CST 2.6.24 -21-generic


以上就是关于《Linux中什么是重定向-linux重定向和管道》的全部内容,本文网址:https://www.7ca.cn/baike/18227.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明

排行榜