当前位置: 澳门新濠3559 > 操作系统 > 正文

错误输出重定向到文件,标准输出

时间:2019-12-08 05:50来源:操作系统
1. 标准输入和输出 执行一个命令,有输入,有输出。 标准输入: standard input ,检查 stdin ,代码为0, 使用 或 标准输出: standard output, 简称:stdout .命令执行返回的正确结果, 代码为1,

澳门新濠3559 1

1. 标准输入和输出

执行一个命令,有输入,有输出。 标准输入: standard input ,检查 stdin , 代码为0, 使用< 或 << 标准输出: standard output, 简称:stdout . 命令执行返回的正确结果, 代码为1, 使用 > 或 >> 标准错误输出; standard error output. 简称:stderr, 命令执行返回的错误信息。 代码为2, 使用 > 或 >> 默认都输出到屏幕上。

3. 错误输出重定向

  • 覆盖输出 2>

  • 追加输出 2>>

示例:错误输出重定向到文件

[root@VM_41_201_centos ~]# lss 2> ls.error
[root@VM_41_201_centos ~]# cat ls.error
-bash: lss: 未找到命令
[root@VM_41_201_centos ~]# lss 2>> ls.error
[root@VM_41_201_centos ~]# cat ls.error
-bash: lss: 未找到命令
-bash: lss: 未找到命令
[root@VM_41_201_centos ~]#

linuxprobe这个文件是真实存在的,即使用标准输出即可将数据写入到文件中,而错误输出的重定向则不行,依然会把信息输出到了屏幕上

2. 数据流输出重定向

输出默认为屏幕, 可以将输出重定向到文件或其他设备。 使用 > 或 >> > : 表示覆盖写入 >> : 表示追加到原文件末尾,原文件为空则创建文件。

$ find /home -name .bashrc                 
find: /home/lost+found: Permission denied     //stderr
/home/user/.bashrc     //stdout

使用 > 将内容重定向到文件

$ find /home -name .bashrc > std_out 2> std_err

将查询结果写入到std_out文件 将标准错误写入到std_err文件 注意 :2> 或 2>> 中间不能有空格。
/dev/null 目录表示空设备, 写入这儿的内容会被丢弃。 如果不想保存错误信息可以写入/dev/null

$ find /home -name .bashrc > std 2> /dev/null

想把正确和错误的写入一个文件,使用 2>&1 或 &>

$ find /home -name .bashrc > std_out 2>&1
$ find /home -name .bashrc  &> std_out 

一般建议使用第一种写法。

5. 输入重定向

输入重定向相比较而言,就比较简单了,而且用得相对较少

一般用法:将文件作为输入重定向到命令

命令 < 文件

示例:将文件输入重定向至命令wc统计文件行数:

[root@VM_41_201_centos ~]# wc -l < anaconda-ks.cfg
148
[root@VM_41_201_centos ~]#

澳门新濠3559 2

linux数据流重定向

1. 输入与输出

  • 标准输入 STDIN
    文件描述符:0,默认:键盘输入
  • 标准输出 STDOUT
    文件描述符:1,默认:屏幕输出
  • 错误输出 STDERR
    文件描述符:2,默认:屏幕输出

   

3. 输入重定向

stdin 为键盘输入,使用cat

[[email protected] sh]$ cat > catfile
hello 
this is from cat .

#按Ctrl+d
[[email protected] sh]$ 

<为把键盘输入改为文件内容输入

[[email protected] sh]$ cat > catfile < pass

<< 表示结束输入。

[[email protected] sh]$ cat > catfile << "eof"
> hello,
> this is from cat 
> eof
[[email protected] sh]$ cat catfile 
hello,
this is from cat 
[[email protected] sh]$

当键盘输入eof结束输入,而不必输入Ctrl+d.

1. 标准输入和输出 执行一个命令,有输入,有输出。 标准输入: standard input ,检查 stdin , 代码为0, 使用 或 标准输出:...

6. 管道

管道用于连接多个命令(程序),将前一个命令的结果重定向,作为后一个命令的输入

COMMAND1 | COMMAND2 | COMMAND3 | ...

示例:将文件内容通过管道重定向到命令(其效果类似输入重定向)

[root@VM_41_201_centos ~]# cat anaconda-ks.cfg | wc -l
148
[root@VM_41_201_centos ~]#

命令 < 文件:将/etc/passwd文件作为wc命令的标准输入,相当于命令"cat /etc/passwd | wc -l"统计行数(统计用户个数)

4. 合并标准输出与错误输出重定向

  • 覆盖输出 &>
COMMAND &> 文件  
COMMAND > 文件 2>&1    #不推荐这种形式,难记,不好理解
COMMAND > 文件A 2> 文件B
  • 追加输出 &>>
COMMAND &>> 文件  
COMMAND >> 文件 2>&1    #不推荐这种形式,难记,不好理解
COMMAND >> 文件A 2>> 文件B

示例:合并标准输出与错误输出重定向

# 标准输出
[root@VM_41_201_centos ~]# ls -m
anaconda-ks.cfg, ls.error, ls.txt, sh

# 标准输出重定向到文件
[root@VM_41_201_centos ~]# ls -m &> ls.txt
[root@VM_41_201_centos ~]# cat ls.txt
anaconda-ks.cfg, ls.error, ls.txt, sh

# 错误输出重定向到文件(追加)
[root@VM_41_201_centos ~]# lss &>> ls.txt
[root@VM_41_201_centos ~]# cat ls.txt
anaconda-ks.cfg, ls.error, ls.txt, sh
-bash: lss: 未找到命令

# 合并标准输出与错误输出(标准输出,覆盖)
[root@VM_41_201_centos ~]# ls -m > ls.txt 2>&1
[root@VM_41_201_centos ~]# cat ls.txt
anaconda-ks.cfg, ls.error, ls.txt, sh

# 合并标准输出与错误输出(错误输出,覆盖)
[root@VM_41_201_centos ~]# lss > ls.txt 2>&1
[root@VM_41_201_centos ~]# cat ls.txt
-bash: lss: 未找到命令

# 合并标准输出与错误输出(错误输出,追加)
[root@VM_41_201_centos ~]# lsss >> ls.txt 2>&1
[root@VM_41_201_centos ~]# cat ls.txt
-bash: lss: 未找到命令
-bash: lsss: 未找到命令

# 合并标准输出与错误输出(错误输出,追加 ,另一种方式)
[root@VM_41_201_centos ~]# lsls &>> ls.txt
[root@VM_41_201_centos ~]# cat ls.txt
-bash: lss: 未找到命令
-bash: lsss: 未找到命令
-bash: lsls: 未找到命令
[root@VM_41_201_centos ~]#

#使用COMMAND > 文件A 2> 文件B、COMMAND >> 文件A 2>> 文件B的形式
[root@VM_41_201_centos ~]# ls
anaconda-ks.cfg  ls.error  ls.txt  sh  tee.txt
[root@VM_41_201_centos ~]# ls -m > A 2> B
[root@VM_41_201_centos ~]# ls -m
A, anaconda-ks.cfg, B, ls.error, ls.txt, sh, tee.txt
[root@VM_41_201_centos ~]# cat A
A, anaconda-ks.cfg, B, ls.error, ls.txt, sh, tee.txt
[root@VM_41_201_centos ~]# cat B
[root@VM_41_201_centos ~]# sl -m > A 2> B
[root@VM_41_201_centos ~]# cat A
[root@VM_41_201_centos ~]# cat B
-bash: sl: 未找到命令
[root@VM_41_201_centos ~]# lss -m >> A 2>> B
[root@VM_41_201_centos ~]# cat B
-bash: sl: 未找到命令
-bash: lss: 未找到命令
[root@VM_41_201_centos ~]#

对于输入重定向有这些情况:

7. 相关命令

以下几个命令经常与IO重定向(> >> 2> 2>> &> &>> )管道(|)结合使用

  • tee
    read from standard input and write to standard output and files

tee命令比较特殊:从标准输入读取、写入标准输出、写入文件(同时干了3件事,一箭三雕),IO重定向与tee更配哦。

示例:tee命令(执行结果既输出到了指定文件,又输出到了terminal)

[root@VM_41_201_centos ~]# ls
anaconda-ks.cfg  ls.error  ls.txt  sh
[root@VM_41_201_centos ~]# ls -m | tee tee.txt
anaconda-ks.cfg, ls.error, ls.txt, sh
[root@VM_41_201_centos ~]# cat tee.txt
anaconda-ks.cfg, ls.error, ls.txt, sh
[root@VM_41_201_centos ~]#
  • tr - translate or delete characters

tr命令用于替换及删除字符

SYNOPSIS

tr [OPTION]... SET1 [SET2]

OPTIONS

-c, -C, --complement
    use the complement of SET1

-d, --delete
    delete characters in SET1, do not translate

-s, --squeeze-repeats
    replace each input sequence of  a  repeated  character  that  is listed in SET1 with a single occurrence of that character

-t, --truncate-set1
    first truncate SET1 to length of SET2

示例

[root@VM_41_201_centos ~]# cat ls.error
-bash: lss: 未找到命令
-bash: lss: 未找到命令
[root@VM_41_201_centos ~]# cat ls.error | tr b B
-Bash: lss: 未找到命令
-Bash: lss: 未找到命令
[root@VM_41_201_centos ~]#
  • 输入重定向分界符:<<

允许用户一直输入,直到输入的内容匹配<<指定的字符串

# EOF可以用其它字符代替,习惯用EOF,end of file
命令 << EOF

示例:

[root@VM_41_201_centos ~]#
[root@VM_41_201_centos ~]# cat << EOF
> 1.a
> 2.b
> 3.c
> EOF
1.a
2.b
3.c
[root@VM_41_201_centos ~]#

将标准输出与错误输出共同写入到文件中(原文件信息保留,追加到后面)

2. 标准输出重定向

  • 覆盖输出 >

  • 追加输出 >>

注意:shell的内嵌命令set可以设置是否允许输出重定向至已存在的文件

set -C:禁止输出重定向至已存在的文件
set +C:允许输出重定向至已存在的文件

示例:标准输出重定向到文件(实际动作:先创建文件,再向其中写入标准输出内容)

[root@VM_41_201_centos ~]# ls -m
anaconda-ks.cfg, sh
[root@VM_41_201_centos ~]# ls -m > ls.txt
[root@VM_41_201_centos ~]# cat ls.txt
anaconda-ks.cfg, ls.txt, sh
[root@VM_41_201_centos ~]# ls -m >> ls.txt
[root@VM_41_201_centos ~]# cat ls.txt
anaconda-ks.cfg, ls.txt, sh
anaconda-ks.cfg, ls.txt, sh
[root@VM_41_201_centos ~]#

   

standard output:默认输出到屏幕,为1时表示输出到文件

 

通过数据流重定向分别将

标准输出重定向:命令 > 文件

澳门新濠3559,-a:以累加(append)的方式,将数据加入文件中(tee命令默认清空覆盖)

澳门新濠3559 3

澳门新濠3559 4

命令 << 分界符:用cat命令直接将输入的信息输出到catfile中,且当由键盘输入"eof"分界符(ctrl+d)时输入才停止

<>

 

   

简单一句话概括:"使用输入重定向能把文件导入到命令中,而输出重定向则是能够把原本要输出到屏幕的数据信息写入到指定文件中"

双向重定向:tee(T,T型水管接口)命令

澳门新濠3559 5

①标准输出:读取/etc/crontab后,将该文件内容显示到屏幕上

将错误信息直接忽略(不显示、不存储):黑洞设备/dev/null可以"吃掉"任何导向这个设备的信息

standard error output:默认输出到屏幕,为2时表示输出到文件

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

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

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

澳门新濠3559 6

澳门新濠3559 7

   

澳门新濠3559 8

   

重定向 详解 :<>

符号

作用

命令 < 文件

将文件作为命令的标准输入

命令 << 分界符

从标准输入中读入,直到遇见"分界符"才停止(内联输入重定向)

命令 < 文件1 > 文件2

将文件1作为命令的标准输入并将标准输出到文件2

  

  

②标准错误输出:因为无法找到/etc/crontab/vbird,因此在屏幕上显示错误信息

 

Linux启动后,会默认打开3个文件描述符(通过分配的一个数字,实现对文件的读写操作),分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2

一个优秀的linux博客: <>

Linux命令执行过程的数据传输情况:

2>&1的含义:

澳门新濠3559 9

选项:

系统默认存在/etc/crontab文件,却无/etc/crontab/vbird这个文件,执行"cat /etc/crontab /etc/crontab/vbird"这个命令,cart会进行:

<>

追加写入:命令 >> 文件

标准输出("正确"的输出数据)输出/存放到ist1_right文件中(通过>),

符号

作用

命令 > 文件

将标准输出重定向到一个文件中(清空原有文件的数据)

命令 2> 文件

将错误输出重定向到一个文件中(清空原有文件的数据)

命令 >> 文件

将标准输出重定向到一个文件中(追加到原有内容的后面)

命令 2>> 文件

将错误输出重定向到一个文件中(追加到原有内容的后面)

命令 >> 文件 2>&1 或命令 &>> 文件

将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)

tee会同时将数据流送往文件与屏幕。

错误输出重定向:命令 2> 文件(若该文件不存在,系统会自动创建)

standard intput:默认从键盘输入,为0时表示从其他文件或命令的输入

(&>可实现清空后再写入)

参考资料:

标准错误输出("错误的"输出信息)输出/存放到list2_error文件中(通过2>)

澳门新濠3559 10

澳门新濠3559 11

澳门新濠3559 12

   

   

   

用stdin替代键盘的输入以创建新文件(将.bashrc文件作为cat命令的标准输入并输出到创建的catfile文件中(类似cp命令复制的一般)):命令 < 文件1 > 文件2

澳门新濠3559 13

澳门新濠3559 14

对于输出重定向符有这些情况:

而输出到屏幕的,是stdout,且可以让下个命令继续处理

   

编辑:操作系统 本文来源:错误输出重定向到文件,标准输出

关键词: