理一理linux中的1>、1>>、2>、2>>、>&、2>&1等具体的含义

0 评论
/ /
4422 阅读
/
5712 字
30 2020-03

linux中的>、>>、<、<<、2>、2>>、2>&1、&>、&<,总归要面对的

为了更好的理解这个问题,我们需要谭本溯源。

一、简单了解一下标准输入输出

执行一个shell命令行时通常会自动打开三个标准文件

(1) 、标准输入文件(stdin)

通常对应终端的键盘。

(2)、标准输出文件(stdout)。

(3)、标准错误输出文件(stderr)。

(2)和(3)这两个文件都对应终端的屏幕。

进程将从标准输入文件中得到输入数据。

将正常输出数据输出到标准输出文件[显示器]。

将错误信息送到标准错误文件中[显示器]。

下图所示:

0、1、2表示一个文件描述符

理一理linux中的1>、1>>、2>、2>>、>&、2>&1等具体的含义

理一理linux中的1>、1>>、2>、2>>、>&、2>&1等具体的含义

但是,有时候我们不想把一些进程处理后信息输出到显示器。

这时我们就引出了重定向。

2、 重定向

改变标准输入/输出的方向

三种重定向:

1、重定向标准输出,包括两种。

(1)、>(覆盖),等价1>

将命令执行的结果输出到指定文件,非显示器。

(2) 、>>(追加),等价1>>

将命令执行的结果追加到指定文件,非显示器。

2、 重定向标准输入,包括两种。

(1) 、<

将命令中接收的输入途径,由键盘改为指定文件。

(2) 、<<[Here Document]

命令序列传递到一个交互程序或者命令中。

3、 重定向标准错误,包括两种。

(1) 、2>(覆盖)

将命令执行的结果输出到指定文件。

(2) 、2>>(追加)

将命令执行的结果追加到指定文件。

三、补充

1、重定向标准输出和重定向标准错误到同一个文件中

有以下的几种方式

(1) 、2>&1

(2) 、>&

(3) 、&>

2、 两个特殊文件

(1) 、/dev/nul

过滤标准错误信息

意思就是不想显示结果就输出到这里面。

(2) 、/dev/zero

创建指定长度的文件

四、案例

案例1:

测试> and >>

echo "使用>输出到文件shellFile">shellFile.txt

echo "使用>>追加内容到shellFile">>shellFile.txt

echo "使用>覆盖全部内容">shellFile.txt

//清空文件

>shellFile.txt

理一理linux中的1>、1>>、2>、2>>、>&、2>&1等具体的含义

案例2:

测试< and <<

测试<

echo -e "123456\n123456">passwd.txt

useradd demo

//从文件中读取密码

passwd demo < passwd.txt

理一理linux中的1>、1>>、2>、2>>、>&、2>&1等具体的含义

测试<<

//注意EOF结束标志

[root@kingdom stdin_out_err]# passwd demo << EOF

> abcdef

> abcdef

> EOF

理一理linux中的1>、1>>、2>、2>>、>&、2>&1等具体的含义

案例3:

测试2> and 2>>

//查看当前目录的文件

[root@kingdom stdin_out_err]# ll

total 4

-rw-r--r-- 1 root root 14 Jan 22 16:25 passwd.txt

-rw-r--r-- 1 root root 0 Jan 22 16:19 shellFile.txt

//查看一条没有的文件记录,将错误信息输出到errFile.txt

[root@kingdom stdin_out_err]# ll noFile.txt 2> errFile.txt

[root@kingdom stdin_out_err]# cat errFile.txt

ls: cannot access noFile.txt: No such file or directory

//追加

[root@kingdom stdin_out_err]# ll noFile.txt 2>> errFile.txt

[root@kingdom stdin_out_err]# cat errFile.txt

ls: cannot access noFile.txt: No such file or directory

ls: cannot access noFile.txt: No such file or directory

理一理linux中的1>、1>>、2>、2>>、>&、2>&1等具体的含义

案例4:

测试重定向标准输出和重定向标准错误到同一个文件中

(1)、>&

[root@kingdom stdin_out_err]# ll

total 8

-rw-r--r-- 1 root root 57 Jan 22 16:36 errFile.txt

-rw-r--r-- 1 root root 14 Jan 22 16:25 passwd.txt

-rw-r--r-- 1 root root 0 Jan 22 16:19 shellFile.txt

//查看两个文件,passwd.txt存在,passwd1.txt不存在

[root@kingdom stdin_out_err]# ll passwd.txt passwd1.txt &> one.txt

//查看输出,一条成功,一条错误

[root@kingdom stdin_out_err]# cat one.txt

ls: cannot access passwd1.txt: No such file or directory

-rw-r--r-- 1 root root 14 Jan 22 16:25 passwd.txt

理一理linux中的1>、1>>、2>、2>>、>&、2>&1等具体的含义

(2)、&>

与上面的案例类似,不做解释

理一理linux中的1>、1>>、2>、2>>、>&、2>&1等具体的含义

(3) 、2>&1

//ll执行的结果输出到file中

[root@kingdom stdin_out_err]# ll passwd.txt passwd1.txt > file 2>&1

//查看输出

[root@kingdom stdin_out_err]# cat file

ls: cannot access passwd1.txt: No such file or directory

-rw-r--r-- 1 root root 14 Jan 22 16:25 passwd.txt

理一理linux中的1>、1>>、2>、2>>、>&、2>&1等具体的含义

案例5:

使用/dev/nul文件

有时候我们使用命令,不想将输出的信息显示到界面

这时我们可以使用 &> /dev/nul[常用]

简单测试修改demo 用户密码

//修改用户demo的密码,执行完后会有一些提示信息

[root@kingdom stdin_out_err]# echo "123456" | passwd --stdin demo

Changing password for user demo.

passwd: all authentication tokens updated successfully.

//使用&> /dev/nul不再显示器中显示这些信息

[root@kingdom stdin_out_err]# echo "123456" | passwd --stdin demo &> /dev/nul

[root@kingdom stdin_out_err]#

理一理linux中的1>、1>>、2>、2>>、>&、2>&1等具体的含义

测试完成。

欢迎大家给予宝贵的意见或者建议。

欢迎大家补充或者共享一些其他的方法。

感谢支持。