HOME
BLOG
TIME
FRIENDS
SAY TO ME
MOOD
TRAVELING
浅谈Linux标准输入输出重定向
2020/08/02 2.2k 7 分钟 点击

在冯·诺依曼体系中,计算机制造有三个基本原则,他们分别是:采用二进制逻辑、程序存储执行和计算机由五个部分组成。

而在计算机的五个部分中,便是有运算器、控制器、存储器、输入设备、输出设备这些内容。

我们的Linux也是在基于这些内容才可以运行起来,今天就来简单说一下关于输入设备与输出设备这些内容。

linux的标准输入设备指的就是我们的键盘,扫描仪,而标准输出设备指的肯定是显示器,当然也可以有其他设备,比如打印机这一类的,但是,在标准输出中又有一种叫标准错误输出,也就是说我们的命令如果是错误的,他所显示的内容也会显示在显示器上。

这便是我们朝夕相处的方式。

但是一些让人觉得难以启齿的错误,如果我们不想让他显示在屏幕上,想把他藏起来,这时候我们该怎么办呢?于是,便有了输出重定向这一种功能,下面我们就来谈一谈关于重定向的一些小细节。

在Linux的世界中,可以说是一切皆文件,一些设备,比如磁盘,都是以文件形式反映在系统中的,那键盘显示器呢?

设备 设备名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出
这张表上写的便是在/dev目录下存放的文件设备,键盘,显示器,便是这样被系统调用的,系统通过设备与文件描述符,把我们输入的命令,与他回馈给我们的信息进行着完美的转换。何为文件描述符呢?Linux系统内核利用的便是文件描述符才能来进行文件的访问。而文件描述符又必须得是非负整数。在我们打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。这便是官方的定义。所以,文件描述符是可以自己来设置的,但是对于Linux初始的0,1,2就已经是很好的了。那我们就来说说他的用法就OK了。

标准输出重定向的符号是>,标准错误输出重定向的符号是2>,这便是文件描述符的用法了,其实标准输出重定向的符号也可以是1>,只不过我们都把他省略了,系统默认的>符号也是标准输出重定向的符号。

那下面我们就来用命令来具体说说:

如果你输入==echo “abc”>file.txt==,这条命令的意思是,创建一个文件file.txt并且在其中输入abc,我们之间省略了touch这一步,相当于使用了vim,这便是最基础的用法,重定向了echo “abc”命令的输出位置,他不再输出到屏幕上。但是>左边的命令不能是错误的,比如:echo “abc”不能变为”abc”,否则会报错

那我们在使用同样的命令呢?==echo “def” > file.txt== 这又会是什么样的结果呢?使用cat file.txt命令查看,你会发现原来的abc没有了,只剩下刚刚添加的def了,这是因为>同时也有覆盖的意思,这里说一个小技巧,在企业运维中,如果一个分区快被占满了,我们知道其中的一些文件没用了,可以删掉用来释放分区,我们应该删除它,这里是不是会想使用rm命令之间删除呢?其实这样删除的话,如果有用户在这个文件里进行操作,或者有一个程序真在使用它,使用rm命令删除并不能立即释放空间,==losf | grep deleted== 这条命令便是查看那些你删除了,但却没有释放空间的命令,只要程序不在访问他,他才会释放,那我们如果在这种情况下安全的释放空间呢?==> 文件路径== 我们便可以使用这条命令,它用于清空文件,我们并没有删除它,但是它的大小已经变为0了,被覆盖了,它可以用于企业删除占大内存的文件。(你也可以使用==dd if=/dev/zero of=/boot/file bs=1M count=800== 这条命令来做一个小实验,在boot分区下创建文件file,来试一试)

> 是覆盖的话,我们想在文件里面添加新内容就得使用>>来进行追加,这便是追加的方式,echo “def” >> file.txt 文件里就会出现abcdef了。你也可以使用==set -C 文件名==命令禁止内容被>覆盖,但可追加,它的作用:转向所产生的文件无法覆盖已存在的文件。使用==set +C 文件名==来解除锁定,但是>| 这条命令又可以强行覆盖。

回答刚开始的问题,如果一些难以启齿的错误不想被别人看到,该怎么办呢?Linux没有和Windows一样的垃圾箱,删除文件之后不可以找回,但是却有一个向黑洞一样的设置文件,就是/dev/null 只要进去的文件,就会向进了黑洞一般,永远的消失了,我们利用这一点 使用 ==命令 &> /dev/null== 命令,将你的错误与正确输出全部丢进去,就在屏幕上看不到他们了。当然也还有以下用法:

  • &> 结果对的和错的都放在一起,也可以
    ls /root /data/null &> /data/f1
    这是新版的用法,一些老的运维工程师使用的都是下面这条命令
    • ls /root /data/null > /data/f1 2>&1

第二种写法便是使用了标准错误输出重定向,2>,这样标明2>&1就是把错误的输出也变为正确的输出,就可以都丢到 /data/f1这个文件里了,不过也还有其他用法:

  • ls (/root;/root/null) > /data/f1 2> /data/f2 把对的和错的分开放
    ==(多条命令放在小括号里进行全部的重定向)==

标准输入重定向是这样的符号:

< 标准输入重定向,他与标准输出重定向相反
它的作用就是把键盘输入变成其他方式的输出,比如文件输入,让命令识别文件。举个例子:

cat命令内置标准输出重定向
他会把你输入的再原封不动的输出来
利用这个机制,可以实现cp命令的操作

cat < file.txt > file2.txt
它是把file.txt文件的内容输入,然后再由cat把它输出到file2.txt文件中,这便是输入重定向。

还有一些其他的小工具:
tr 转换和删除字符
tr ‘a-z’ ‘A-Z’
就会把小写转换为大写

后面可以跟以下选项:

  • -t 使括号里的转换规则一一对应
  • -d 把出现的字符删除
  • -c 表示取设定规则的相反规则
  • -s 压缩连续的字符,比如aabb 输出ab
  • 也可以后面加其他符号,把压缩的字符替换为新符号
    例子:*
  • 1+2+…+100
    echo {1..100} >bc.txt
    tr -s ‘ ’ + < bc.txt > bc1.txt
    bc < bc1.txt*
  • 这样就算出了1+2+…+100的和了。*

cat > f1 <<EOF 多行重定向设定开始与结束标记
当你只输入cat命令是,后面不加参数,光标就会换到下一行,等待你输入,知道你按ctrl+d 提交结果后才会退出,这也可以看出cat命令是内置标准输出重定向的

tee命令
重定向多个目标
命令1 | tee [-a] 文件名 | 命令2
即显示在屏幕,又保存到文件
加-a 追加文件,不进行覆盖
这个命令用于复杂管道的排错,很有效果

这些就是关于标准输入输出重定向的以下内容,小技巧,以及我的理解了,如果有什么不对的地方,还望指正!!谢谢大家。有兴趣的可以去看看我的博客:从零开始学习Linux.
以及网络篇:Linux基础网络服务搭建.

Linux学习笔记