Shell 输入输出重定向

Shell 默认的输入为键盘输入, 默认输出则是终端的Shell 窗口. 但是有时候我们希望某些命令输出的内容不显示,或者想将输出的结果写入其它文件, 这就用到了输出重定向. 输出重定向不常用, 所以就不做描述了.

1. Linux 下的标准输入输出

Linux 下一切皆文件, 输入输出也不例外.虽然标准输入时键盘输入, 标准输出为终端显示器,但是在linux 中标准输入输出也对应着响应的文件. 一般情况下, 每个Linux 命令运行时都会打开三个文件:

  • 标准输入文文件(/dev/stdin): 文件描述符为0, linux 程序默认从stdin 读取数据
  • 标准正确输出文件(/dev/stdout): 文件描述符为1, linux 程序默认将正确输出写入stdout中
  • 标准错误输出文件(/dev/stderr): 文件描述符为2, linux 程序默认会将错误输出写入stderr 文件夹中
[admin@localhost shell]$ ll /dev/std*
lrwxrwxrwx. 1 root root 15 Jun 19 13:46 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Jun 19 13:46 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Jun 19 13:46 /dev/stdout -> /proc/self/fd/1
[admin@localhost shell]$

2.输出重定向

2.1 文件重定向

在进行shell 脚本编程的时候, 我们可能会将一些命令输出或者结果输出到指定文件中, 那么就可以使用输出重定向了.

常用重定向:

语法 描述
命令 > 文件 以覆盖方式, 将正确输出写入文件中
命令 >> 文件 以追加方式, 将正确输出写入文件中
命令 2> 文件 以覆盖方式, 将命令错误输出写入文件中
命令 2>> 文件 以追加方式, 将命令错误输出写入文件中
命令 &> 文件 已追加方式, 将命令正确&错误输出写入文件中
命令 &>> 文件 已追加方式,将命令正确&错误输出写入文件中
命令 >> 文件1 >> 文件2 以追加方式,将命令正确输出写入文件1,将错误输出写入文件2
  • 表示以覆盖方式写入, 会先将原来的文件内容情况后写入

  • 表示以追加方式写入, 不会修改原来的文件内容, 直接在原来文件末尾追加

2.2 特殊重定向

LInux 中很多命令都是有输出结果的, 有时我们希望不显示命令的输出结果, 但又不想将文件写入其它文件, 那么我们只需要将输出结果重定向到 /dev/null 文件即可. /dev/null 是一个特殊文件, 类似于linux 的黑洞一样.

[admin@localhost shell]$ ll /dev/null 
crw-rw-rw-. 1 root root 1, 3 Jun 19 13:46 /dev/null
[admin@localhost shell]$ [admin@localhost shell]$ ll /dev/null 
crw-rw-rw-. 1 root root 1, 3 Jun 19 13:46 /dev/null
[admin@localhost shell]$

3.示例程序

#!/bin/bash

#定义正确输出, 错误输出文件
f_std=info.txt
f_err=error.txt
f_all=all.txt

# 测试正确输出
echo "测试正确输出:" > $f_std
ls -d /s* >> $f_std

# 测试错误输出
echo "测试错误输出,清空文件:" > $f_err
ls /hh 2>> $f_err

# 测试正确错误输出
echo "测试全部输出, 清空文件" &> $f_all
ls -d /s* &>> $f_all
ls /hh &>> $f_all

测试输出:

[admin@localhost shell]$ ./redirect.sh 
[admin@localhost shell]$ cat info.txt 
测试正确输出:
/sbin
/selinux
/srv
/sys
[admin@localhost shell]$ cat error.txt 
测试错误输出,清空文件:
ls: cannot access /hh: No such file or directory
[admin@localhost shell]$ cat all.txt 
测试全部输出, 清空文件
/sbin
/selinux
/srv
/sys
ls: cannot access /hh: No such file or directory
[admin@localhost shell]$

results matching ""

    No results matching ""