• Linux数据流重定向与管道


    数据流重定向简单来说就是把原本应该输出到某处(比如说屏幕)的数据,重定向其输出目的地,到其他的地方(比如文件)。

    linux中的输入与输出:

      标准输入(stdin):默认从键盘输入

      标准输出(stdout):执行的正常结果信息,默认输出到屏幕

      标准错误输出(stderr):执行的错误信息,默认输出到屏幕

    那就让我们来体验下这三个鬼东西吧:

    [fuwh@localhost 08:32 ~]$ ll  <-- 标准输出,默认结果输出到屏幕
    总用量 24
    drwxrwxr-x. 2 fuwh fuwh 4096 7月  30 13:42 bin
    drwxr-xr-x. 3 fuwh fuwh 4096 7月  26 12:04 data
    drwxrwxr-x. 2 fuwh fuwh 4096 8月   3 20:34 stu
    drwxrwxr-x. 3 fuwh fuwh 4096 7月  25 10:27 stu2
    -rw-r--r--. 1 root root 2439 7月  26 11:57 stu2.tar.bz2
    -rw-r--r--. 1 root root  165 7月  26 11:57 stu2.tar.gz
    [fuwh@localhost 08:33 ~]$ ll dat  <-- 标准错误输出,默认结果输出到屏幕
    ls: 无法访问dat: 没有那个文件或目录
    [fuwh@localhost 08:33 ~]$ cat name
    cat: name: 没有那个文件或目录
    [fuwh@localhost 08:33 ~]$ cat he
    cat: he: 没有那个文件或目录
    [fuwh@localhost 08:33 ~]$ cat > he  <-- 标准输入,默认键盘
    name
    go
    [fuwh@localhost 08:34 ~]$ 

    输出或者错误输出重定向就是,我不想把这些信息输出到屏幕上了,我希望输出到文件里面之类的。

    输入从定向就是我不希望从键盘输入,我希望用一个文件来作为输入之类的。

      标准输入:代码为0,使用 < 或 <<

      标准输出:代码为1,使用 > 或 >>

      标准错误输出:代码为2,使用 2> 或 2>>

      ※>>或<<表示累加,其中>就是表示1>

    下面我们就来试一下:

    [fuwh@localhost 08:41 ~/stu]$ ll
    总用量 0
    [fuwh@localhost 08:41 ~/stu]$ ll ../
    总用量 28
    drwxrwxr-x. 2 fuwh fuwh 4096 7月  30 13:42 bin
    drwxr-xr-x. 3 fuwh fuwh 4096 7月  26 12:04 data
    -rw-rw-r--. 1 fuwh fuwh    8 8月   5 08:33 he
    drwxrwxr-x. 2 fuwh fuwh 4096 8月   5 08:41 stu
    drwxrwxr-x. 3 fuwh fuwh 4096 7月  25 10:27 stu2
    -rw-r--r--. 1 root root 2439 7月  26 11:57 stu2.tar.bz2
    -rw-r--r--. 1 root root  165 7月  26 11:57 stu2.tar.gz
    [fuwh@localhost 08:42 ~/stu]$ ll ../ > home.txt  <-- 标准输出重定向,重定向到一个文件
    [fuwh@localhost 08:42 ~/stu]$ ll ../dat
    ls: 无法访问../dat: 没有那个文件或目录
    [fuwh@localhost 08:42 ~/stu]$ ll ../dat 2> err.txt <-- 标准错误输出重定向,重定向到一个文件
    [fuwh@localhost 08:42 ~/stu]$
    [fuwh@localhost 08:42 ~/stu]$ cat > c.txt
    name
    [fuwh@localhost 08:44 ~/stu]$ cat c.txt
    name
    age[fuwh@localhost 08:44 ~/stu]$ cat home.txt
    总用量 28
    drwxrwxr-x. 2 fuwh fuwh 4096 7月  30 13:42 bin
    drwxr-xr-x. 3 fuwh fuwh 4096 7月  26 12:04 data
    -rw-rw-r--. 1 fuwh fuwh    8 8月   5 08:33 he
    drwxrwxr-x. 2 fuwh fuwh 4096 8月   5 08:42 stu
    drwxrwxr-x. 3 fuwh fuwh 4096 7月  25 10:27 stu2
    -rw-r--r--. 1 root root 2439 7月  26 11:57 stu2.tar.bz2
    -rw-r--r--. 1 root root  165 7月  26 11:57 stu2.tar.gz
    [fuwh@localhost 08:44 ~/stu]$ cat > c.txt < home.txt <-- 标准输入重定向,从文件输入
    [fuwh@localhost 08:44 ~/stu]$ cat c.txt
    总用量 28
    drwxrwxr-x. 2 fuwh fuwh 4096 7月  30 13:42 bin
    drwxr-xr-x. 3 fuwh fuwh 4096 7月  26 12:04 data
    -rw-rw-r--. 1 fuwh fuwh    8 8月   5 08:33 he
    drwxrwxr-x. 2 fuwh fuwh 4096 8月   5 08:42 stu
    drwxrwxr-x. 3 fuwh fuwh 4096 7月  25 10:27 stu2
    -rw-r--r--. 1 root root 2439 7月  26 11:57 stu2.tar.bz2
    -rw-r--r--. 1 root root  165 7月  26 11:57 stu2.tar.gz
    [fuwh@localhost 08:44 ~/stu]$

    如果我们想让标准输入和标准错误输入都输出到一个文件,那又应该怎么操作呢?

    那这时候需要使用一种特殊写法了

    [fuwh@localhost 08:49 ~/stu]$ cat c.txt a.txt
    总用量 28
    drwxrwxr-x. 2 fuwh fuwh 4096 7月  30 13:42 bin
    drwxr-xr-x. 3 fuwh fuwh 4096 7月  26 12:04 data
    -rw-rw-r--. 1 fuwh fuwh    8 8月   5 08:33 he
    drwxrwxr-x. 2 fuwh fuwh 4096 8月   5 08:42 stu
    drwxrwxr-x. 3 fuwh fuwh 4096 7月  25 10:27 stu2
    -rw-r--r--. 1 root root 2439 7月  26 11:57 stu2.tar.bz2
    -rw-r--r--. 1 root root  165 7月  26 11:57 stu2.tar.gz
    cat: a.txt: 没有那个文件或目录
    [fuwh@localhost 08:49 ~/stu]$ cat c.txt a.txt > jt.txt 2>&1
    [fuwh@localhost 08:50 ~/stu]$ cat jt.txt
    总用量 28
    drwxrwxr-x. 2 fuwh fuwh 4096 7月  30 13:42 bin
    drwxr-xr-x. 3 fuwh fuwh 4096 7月  26 12:04 data
    -rw-rw-r--. 1 fuwh fuwh    8 8月   5 08:33 he
    drwxrwxr-x. 2 fuwh fuwh 4096 8月   5 08:42 stu
    drwxrwxr-x. 3 fuwh fuwh 4096 7月  25 10:27 stu2
    -rw-r--r--. 1 root root 2439 7月  26 11:57 stu2.tar.bz2
    -rw-r--r--. 1 root root  165 7月  26 11:57 stu2.tar.gz
    cat: a.txt: 没有那个文件或目录
    [fuwh@localhost 08:50 ~/stu]$ cat c.txt a.txt  &> jt2.txt
    [fuwh@localhost 08:51 ~/stu]$ cat jt2.txt
    总用量 28
    drwxrwxr-x. 2 fuwh fuwh 4096 7月  30 13:42 bin
    drwxr-xr-x. 3 fuwh fuwh 4096 7月  26 12:04 data
    -rw-rw-r--. 1 fuwh fuwh    8 8月   5 08:33 he
    drwxrwxr-x. 2 fuwh fuwh 4096 8月   5 08:42 stu
    drwxrwxr-x. 3 fuwh fuwh 4096 7月  25 10:27 stu2
    -rw-r--r--. 1 root root 2439 7月  26 11:57 stu2.tar.bz2
    -rw-r--r--. 1 root root  165 7月  26 11:57 stu2.tar.gz
    cat: a.txt: 没有那个文件或目录
    [fuwh@localhost 08:51 ~/stu]$

    但是,试想,如果有时候的错误信息,我们既不想输出到屏幕上,也不想保存到文件中去,那应该怎么办呢?

    这个时候,就需要使用一个垃圾桶黑洞的装置了。

    [fuwh@localhost 08:53 ~/stu]$ ll
    总用量 20
    -rw-rw-r--. 1 fuwh fuwh 367 8月   5 08:44 c.txt
    -rw-rw-r--. 1 fuwh fuwh  52 8月   5 08:42 err.txt
    -rw-rw-r--. 1 fuwh fuwh 367 8月   5 08:42 home.txt
    -rw-rw-r--. 1 fuwh fuwh 407 8月   5 08:51 jt2.txt
    -rw-rw-r--. 1 fuwh fuwh 407 8月   5 08:50 jt.txt
    [fuwh@localhost 08:54 ~/stu]$ ll > /dev/null
    [fuwh@localhost 08:54 ~/stu]$ ll
    总用量 20
    -rw-rw-r--. 1 fuwh fuwh 367 8月   5 08:44 c.txt
    -rw-rw-r--. 1 fuwh fuwh  52 8月   5 08:42 err.txt
    -rw-rw-r--. 1 fuwh fuwh 367 8月   5 08:42 home.txt
    -rw-rw-r--. 1 fuwh fuwh 407 8月   5 08:51 jt2.txt
    -rw-rw-r--. 1 fuwh fuwh 407 8月   5 08:50 jt.txt
    [fuwh@localhost 08:54 ~/stu]$

    管道:|

      管道命令就是将上一个命令的标准输出作为下一个命令的标准输入

    [fuwh@localhost 08:57 ~/stu]$ ll
    总用量 0
    [fuwh@localhost 08:57 ~/stu]$ touch a.txt
    [fuwh@localhost 08:57 ~/stu]$ touch ab.txt
    [fuwh@localhost 08:57 ~/stu]$ ll
    总用量 0
    -rw-rw-r--. 1 fuwh fuwh 0 8月   5 08:57 ab.txt
    -rw-rw-r--. 1 fuwh fuwh 0 8月   5 08:57 a.txt
    [fuwh@localhost 08:57 ~/stu]$ ll | cat > c.txt
    [fuwh@localhost 08:57 ~/stu]$ ll
    总用量 4
    -rw-rw-r--. 1 fuwh fuwh   0 8月   5 08:57 ab.txt
    -rw-rw-r--. 1 fuwh fuwh   0 8月   5 08:57 a.txt
    -rw-rw-r--. 1 fuwh fuwh 154 8月   5 08:57 c.txt[fuwh@localhost 08:58 ~/stu]$ cat c.txt
    总用量 0
    -rw-rw-r--. 1 fuwh fuwh 0 8月   5 08:57 ab.txt
    -rw-rw-r--. 1 fuwh fuwh 0 8月   5 08:57 a.txt
    -rw-rw-r--. 1 fuwh fuwh 0 8月   5 08:57 c.txt
    [fuwh@localhost 08:58 ~/stu]$
    [fuwh@localhost 08:59 ~/stu]$ ll a.txt d.txt | cat > f.txt
    ls: 无法访问d.txt: 没有那个文件或目录

    可以发现,这时候标准错误输出是没有被管道传送的。

  • 相关阅读:
    elment ui 日期限制
    javascript中的编码与解码
    vue3 px 转ref
    css 波浪线
    初始化css
    vue 3 的复制功能 vue-clipboard3
    二维数组转一维数组、对象数组互斥去重
    分享几个数组方法
    前端生成图形验证码
    rem自适应布局,移动版
  • 原文地址:https://www.cnblogs.com/zerotomax/p/7288953.html
Copyright © 2020-2023  润新知