1、数据流
不管正确或错误的数据都是默认输出到屏幕上,所以屏幕是混乱的。所以就需要用数据流重定向将这两 条数据分开。数据流重定向可以将标准输出和标准错误输出分别传送到其他的文件或设备去
标准输入(standard input,简称stdin):默认情况下,标准输入指从键盘获取的输入 标准输出(standard output,简称stdout):默认情况下,命令执行所回传正确的信息会输出到 屏幕上 标准错误输出(standard error output,简称stderr):默认情况下,标准错误输出可理解为命令 执行失败后,所回传的错误信息会输出到屏幕上
Number | Channel name | Description | Default connection | Usage |
---|---|---|---|---|
0 | stdin | Standard input | Keyboard | read only |
1 | stdout | Standard output | Terminal | write only |
2 | stderr | Standard error | Terminal | write only |
3+ | filename | Other files | none | read and/or write |
-
Number 0(stdin):
- 含义:标准输入,是程序获取输入数据的通道。
- 默认连接:通常关联键盘,用户通过键盘输入数据。
- 使用方式:只读(程序通过此通道读取输入内容)。
-
Number 1(stdout):
- 含义:标准输出,程序正常运行时输出结果的通道(如命令执行结果)。
- 默认连接:关联终端,结果直接显示在终端界面。
- 使用方式:只写(程序向此通道写入输出内容)。
-
Number 2(stderr):
- 含义:标准错误,程序运行错误或警告信息的输出通道。
- 默认连接:同样关联终端,错误信息默认显示在终端。
- 使用方式:只写(程序向此通道写入错误信息)。
-
Number 3+(filename):
- 含义:代表除 stdin、stdout、stderr 外的其他文件描述符,用于操作普通文件、自定义文件等。
- 默认连接:无默认关联对象,需手动指定文件。
- 使用方式:可读、可写或读写结合,根据实际文件操作需求而定(如打开文件读写数据)。
例如:
命令 -- ip a
查看目录属性 -- ll /root
2、重定向操作符
重定向操作符可以将命令输入和输出数据流从默认设备重定向到其他位置。重定向操作符本身不是命令,而是命令中附加的可改变命令的输入和输出对象的特殊符号。
-
输出重定向操作符:>、>>
-
输入重定向操作符:<、<<
输出重定向
- 标准输出重定向: 1> 或>、 1>> 或>>
- 标准错误输出重定向:2>、 2>>
案例1:输出重定向(覆盖)
将ip a的标准输出重定向到 /root/file1 -- ip a >/root/file1 (覆盖了file1里面原本的内容,如果file1原本不存在,在重定向时创建了file1,> 命令也可以写成 1>,1可以省略)
案例2:输出重定向(追加)
将ip a的标准输出重定向到 /root/file1 -- ls /root >> /root/file3(追加到已有内容后面,不会覆盖已有内容)
案例3:错误输出重定向
将标准错误输出重定向到/root/file3 2>/root/file1
(由下图可知 ,同时前者的内容覆盖了后者原本的内容,2> 2不能省略)
案例4: 正确和错误都输入到相同位置
ls /home/ /aaaaaaaaa &>list.txt
案例5: 正确和错误都输入到相同位置
ls /home/ /aaaaaaaaa >list1.txt 2>&1
2>&1和 &>的区别
1. 2>&1
- 含义:
2>&1
是一种手动的重定向操作,它的作用是将标准错误输出(stderr
)重定向到标准输出(stdout
)。这里的2
代表标准错误输出,1
代表标准输出,&
用于明确表示后面跟着的是一个文件描述符,而不是文件名。
2. &>
- 含义:
&>
是一种简写形式,它的功能是同时将标准输出和标准错误输出重定向到同一个文件。它等同于> file 2>&1
。
区别总结
- 语法简洁性:
&>
是更简洁的写法,能一次性完成标准输出和标准错误输出的重定向;而2>&1
通常需要与单独的标准输出重定向操作(如> file
)配合使用。 - 使用场景:如果只是单纯想把标准输出和标准错误输出都重定向到同一个文件,使用
&>
更方便;如果需要更复杂的重定向操作,例如先将标准错误输出重定向到标准输出,再对合并后的输出进行其他处理,那么使用2>&1
更合适。
案例6:重定向到空设备/dev/null
一般将标准错误输出重定向到空文件(黑洞),这样标准错误输出不会输出在屏幕上,也不会有新文件产生。例如:
输入重定向操作符:<、<<(追加重定向)
使用形式 | 功能 |
命令 >文件或命令 1>文件 | 将命令执行后的标准输出信息不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件 |
命令 2>文件 | 将命令执行后所产生的错误信息不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件 |
命令 2>/dev/null | 将命令执行后所产生的错误信息不在默认的屏幕上显示,而是写入到空设备文件中,即将输出的错误信息丢弃掉 |
命令 &>文件或 命令 >&文件 | 将命令执行后的正确输出信息和错误信息不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件 |
命令 >>文件 | 将命令执行后的正确输出信息以追加的方式写入到指定的文件中,不覆盖原文件内容,若指定的文件不存在,则自动创建该文件 |
命令 <文件 | 使命令从指定的文件中读取数据作为输入 |
命令 <<结束标识字符串 | 在命令行读取数据作为输入,直到遇到指定的结束标识字符串 |
标准输入重定向:< 或0<、0<<或<<
案例1:从文件读取数据作为cat命令的输入
[root@master ~]echo test > file
[root@master ~]cat < filetest
案例2:标准输入重定向<<并不表示追加,而是表示输入结束的意思,即作为一个结束符
[root@localhost ~]cat > file3 << file\> hello\> file# 利用<<右侧的控制字符,我们可以终止输入,不必输入ctrl+d来结束。
[root@localhost ~]cat file3hello
将标准输出重定向到文件
echo命令
语法格式为:“echo [字符串] [$变 量]”
echo命令用于在终端设备上输出字符串或变量提取后的值,执行“echo 字符串”或“echo $变量”就可以,其中$符号意思是提取变量的实际值,以便后续的输出操作。
指定字符串输出到终端屏幕
例如:
root@rrl-virtual-machine:~# echo bugagihia.com
bugagihia.com
使用“$变量”的方式提取出变量SHELL的值,并将其输出到屏幕上
例如:
root@rrl-virtual-machine:~# echo $SHELL
/bin/bash
bash shell提示符
PS1
是 Linux 系统中 Bash shell 的环境变量,用于定义命令行提示符的显示格式。通过设置 PS1
,可自定义提示符展示的内容,例如当前用户、主机名、工作目录、时间等信息。
root@rrl-virtual-machine:~# echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$PS1常用的参数含义如下:
\d :#代表日期,格式为weekday month date,例如:"Mon Aug 1"\H :#完整的主机名称
\h :#仅取主机的第一个名字
\t :#显示时间为24小时格式,如:HH:MM:SS\T :#显示时间为12小时格式
\A :#显示时间为24小时格式:HH:MM\u :#当前用户的账号名称
\v :#BASH的版本信息
\w :#完整的工作目录名称
\W :#利用basename取得工作目录名称,所以只会列出最后一个目录
\# :#下达的第几个命令
\$ :#提示字符,如果是root时,提示符为:# ,普通用户则为:$
默认root用户 PS1
本身的格式定义:[root@localhost ~]# -- [\u@\h \W]\$
临时修改 PS1格式:
export命令
执行后,提示符会按 [\u@\h \A] \w \$
规则显示,包含:
\u
:当前用户名;\h
:主机名简称;\A
:24 小时制简化时间(HH:MM
);\w
:完整工作目录;\$
:提示符符号(root
用户显示#
,普通用户显示$
)。
例如:这里修改了PS1格式,多了[ ]和时间
永久生效(修改配置文件)
若需永久应用,编辑用户配置文件(如 ~/.bashrc
):
echo 'export PS1="[\u@\h \A] \w \$ "' >> ~/.bashrc
source ~/.bashrc # 使配置立即生效