Linux命令 - 标准输入、输出、错误与I/O重定向;管道

1 标准输入、输出、错误

我们运行的许多程序,都会产生某种输出,这些输出由两种类型组成:

  • 程序运行结果
    程序要完成的功能,可能会产生某些输出
  • 状态和错误信息
    程序运行的状态和错误信息,让我们指导程序运行的进展。

正如Unix主题“任何东西都是一个文件”一样。程序实际上把运行结果输送到一个叫标准输出的特殊文件(stdout);把状态信息输送到一个叫标准错误的文件(stderr)。默认情况下,标准输入和标准输出都连接到屏幕上。另外,许多程序从一个叫标准输入(stdin)的设备获取输入,默认情况下,标准输入连接到键盘。

2 I/O重定向

I/O重定向允许我们修改输出地点和输入来源。

2.1 标准输出重定向

标准输出重定向的方式:

  • 使用>重定向符
  • 使用>>重定向符

2.1.1 >重定向符的使用

按照格式command > output.file 使用>重定向符,可以将命令command的标准输出重定向到指定的文件output.file

  • 使用>重定向符时,如果指定的文件已经存在,会清空文件内容;否则创建一个新的空文件。然后将运行结果写入文件。

    这个特性可以用于方便我们情况文件内容
    比如> output.file(重定向符前面没有任何命令),这就会清除output.file文件中的内容。

示例:

  1. 默认情况下,ll命令将结果输出到屏幕
    [root@chinehe test]# ll /
    total 64
    lrwxrwxrwx.  1 root root     7 Sep 19  2023 bin -> usr/bin
    #(为了避免博客过长,这里删除了部分输出~)
    drwxr-xr-x. 19 root root  4096 Sep 19  2023 var
    
  2. 使用>重定向符,将标准输出连接到指定ll.root.out
    [root@chinehe test]# ll / > ll.root.out
    
  3. 查看ll.root.out
    [root@chinehe test]# ll
    total 4
    -rw-r--r-- 1 root root 1087 Nov 12 10:24 ll.root.out
    [root@chinehe test]# cat ll.root.out 
    total 64
    lrwxrwxrwx.  1 root root     7 Sep 19  2023 bin -> usr/bin
    #(为了避免博客过长,这里删除了部分输出~)
    drwxr-xr-x. 19 root root  4096 Sep 19  2023 var
    [root@chinehe test]# 
    
    

2.1.2 >>重定向符的使用

按照格式command >> output.file 使用>>重定向符,可以将命令command的标准输出重定向到指定的文件output.file

  • 使用>>重定向符时,如果指定的文件已经存在,会将运行结果添加到文件内容后面;否则创建一个新的空文件,然后将运行结果写入文件。

    注意>>>两个重定向符的区别 ~

示例:

  1. 默认情况下,ll命令将结果输出到屏幕
    [root@chinehe test]# ll /
    total 64
    lrwxrwxrwx.  1 root root     7 Sep 19  2023 bin -> usr/bin
    #(为了避免博客过长,这里删除了部分输出~)
    drwxr-xr-x. 19 root root  4096 Sep 19  2023 var
    
  2. 使用>>重定向符,将标准输出连接到指定ll.root.out
    [root@chinehe test]# ll / >> ll.root.out
    
  3. 查看ll.root.out,会发现新创建了一个ll.root.out文件,其内容为命令的输出。
    [root@chinehe test]# ll
    total 4
    -rw-r--r-- 1 root root 1087 Nov 12 10:24 ll.root.out
    [root@chinehe test]# cat ll.root.out 
    total 64
    lrwxrwxrwx.  1 root root     7 Sep 19  2023 bin -> usr/bin
    #(为了避免博客过长,这里删除了部分输出~)
    drwxr-xr-x. 19 root root  4096 Sep 19  2023 var
    [root@chinehe test]# 
    
  4. 再来一次,使用>>重定向符,将标准输出连接到指定ll.root.out
    [root@chinehe test]# ll / >> ll.root.out
    
  5. 再看看现在的ll.root.out,会发现文件中有两次执行的输出。(读者可以试试>,它就不会)
    [root@chinehe test]# cat ll.root.out 
    total 64
    lrwxrwxrwx.  1 root root     7 Sep 19  2023 bin -> usr/bin
    #(为了避免博客过长,这里删除了部分输出~)
    drwxr-xr-x. 19 root root  4096 Sep 19  2023 var
    total 64
    lrwxrwxrwx.  1 root root     7 Sep 19  2023 bin -> usr/bin
    #(为了避免博客过长,这里删除了部分输出~)
    drwxr-xr-x. 19 root root  4096 Sep 19  2023 var
    

2.2 标准错误重定向

2.2.1 文件描述符重定向

标准错误重定向并没有专用的重定向操作符。为了重定向标准错误,我们需要参考文件描述符

一个程序可以在几个编号的文件流中的任一个上产生输出。虽然我们已经将这些文件流的前三个称作标准输入、标准输出、标准错误,shell内部分别将其称为文件描述符0、1、2.

shell使用文件描述符提供了一个表示法来重定向文件:

#格式
{命令} {文件描述符}{重定向符}{目标文件}

# 示例
ll /bin/users 1> ll.1.log # 重定向命令标准输出(文件覆盖)
ll /bin/users 1>> ll.1.log # 重定向命令标准输出(文件追加)
ll /bin/users 2> ll.2.log # 重定向命令标准错误(文件覆盖)
ll /bin/users 2>> ll.2.log # 重定向命令标准错误(文件追加)

2.2.2 重定向标准输出&错误到一个文件

某些场景下,我们希望将命令的所有输出(标准输出&错误)都写到同一个文件中,这时我们必须同时重定向标准输出和标准错误。

有两种方式实现:

  • 传统的方法(旧版本中也有效):在重定向标准输出后,使用2>&1将标准错误重定向到标准输出
    ll /bin/users 1> ll.1.log 2>&1
    
  • 第二个方法(新版本中有效):现在的版本中,可以使用&>来实现重定向标准输出和标准错误到指定的文件
    ll /bin/users &> ll.1.log
    

2.3 处理不需要的输出

有时候,我们并不想要一个程序的输出结果,只想“沉默是金”。这时我们可以将其重定向到一个叫/dev/null的特殊文件。

ll /bin/users &> /dev/null

/dev/null文件是系统设备,叫做位存储桶,它可以接受输入,但不对输入做任何处理。

2.4 标准输入重定向

使用<重定向操作符,可以将标准输入重定向到指定的文件。

比如,当我们使用cat命令且不指定文件时,标准输入就是键盘,命令会将我们键盘输入的值输出到标准输出。
示例:

 # 输出重定向到cat.log
[root@chinehe ~]# cat > cat.log
# 键盘输入
Hello
World
I
Am
Cat
# Ctrl+C结束
^C
# 查看日志文件
[root@chinehe ~]# cat cat.log 
Hello
World
I
Am
Cat

我们可以使用<重定向操作符,将标准输入重定向到cat.log文件,标准输出到屏幕。

[root@chinehe ~]# cat < cat.log 
Hello
World
I
Am
Cat

当然这里只是为了讲解如何重定向标准输入,上述的命令效果和cat cat.log并没有什么区别。

3 管道

使用管道操作符|可以将一个命令的标准输出通过管道送至另一个命令的标准输入。

格式:

{command_1} | {command_2} | {command_3}
# 将命令1的标准输出,作为命令2的标准输入;
# 将命令2的标准输出,作物命令3的标准输入。

示例:

ll /bin/ | grep z | less
  1. ll /bin/查看/bin目录下的所有内容
  2. grep zll /bin/的输出中筛选出包含z的项目
  3. less用于查看grep z的输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值