LV02-02-shell-05-重定向
本文主要是shell——相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
参考方向 | 参考原文 |
--- | --- |
Unix 命令默认从标准输入设备( stdin )获取输入,将结果输出到标准输出设备( stdout )显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。
1.输出重定向
1.1输出重定向的概念
命令的输出不仅可以是显示器,还可以输出到某个文件,这就叫做输出重定向。
命令 | 说明 |
command > file | 将输出到显示器的内容重定向到 file文件。 【注意】file文件中原有的内容会被清空 |
command >> file | 将输出到显示器的内容以追加的方式重定向到 file文件。 【注意】file文件中原有的内容会保留,新的内容追加在结尾。 |
【注意】 > 和 >> 两个符号都是起到重定向的作用,但是,前者会清空原有文件,但是后者则为追加。
1.2使用实例
1 | 命令行中执行 |
运行结果如下图:
2.输入重定向
2.1输入重定向的概念
Unix 命令也可以从文件获取输入,而不是默认的键盘
命令 | 说明 |
command < file | 本来需要从键盘获取输入的命令会转移到文件file中读取内容。 |
2.2使用实例
1 | 命令行中执行 |
运行结果如下图:
第一个命令没有进行重定向,会输出文件名;第二个命令却不会,因为第二个命令仅仅知道从标准输入读取内容。
3.重定向的深入理解
3.1文件描述符
文件描述符, File descriptor ,简称 fd ,当应用程序请求内核打开/新建一个文件时,内核会返回一个文件描述符用于对应这个打开/新建的文件,其 fd 本质上就是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于 UNIX 、 Linux 这样的操作系统。
文件描述符 0 通常是标准输入( STDIN ), 1 是标准输出( STDOUT ), 2 是标准错误输出( STDERR )。
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件
标准输入文件(stdin) | stdin的文件描述符为0,Unix程序默认从stdin读取数据。 |
标准输出文件(stdout) | stdout 的文件描述符为1,Unix程序默认向stdout输出数据。 |
标准错误文件(stderr) | stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。 |
3.2重定向命令
默认情况下, command > file 将 stdout 重定向到 file , command < file 将 stdin 重定向到 file 。所有可用重定向命令如下:
输出重定向命令 | 说明 |
command > file | 将输出到显示器的内容重定向到 file文件。 【注意】file文件中原有的内容会被清空 |
command >> file | 将输出到显示器的内容以追加的方式重定向到 file文件。 【注意】file文件中原有的内容会保留,新的内容追加在结尾。 |
n > file | 将文件描述符为 n 的内容重定向到 file文件。 【注意】file文件中原有的内容会被清空。 |
n >> file | 将文件描述符为 n 的内容以追加的方式重定向到 file文件。 【注意】file文件中原有的内容会保留,新的内容追加在结尾。 |
n >& file | 将输出文件 file 和 n 合并。 |
输入重定向命令 | 说明 |
command < file | 本来需要从键盘获取输入的命令会转移到文件file中读取内容。 |
n <& file | 将输入文件 file 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
3.3 stderr 重定向到 file
1 | command 2 > file # 清空原文件再写入 |
3.4 stdout 和 stderr 合并后重定向到 file
1 | command > file 2>&1 |
【注意】这里的 2 和 > 之间不可以有空格, 2> 是一体的时候才表示错误输出。
3.5 stdin 和 stdout 都重定向
1 | command < file1 >file2 |
command 命令将 stdin 重定向到 file1 ,将 stdout 重定向到 file2 。
3.6 Here Document
Here Document 是 Shell 中的一种特殊的重定向方式,它的基本的形式如下:
1 | 将两个 delimiter 之间的内容(document) 作为输入传递给 command |
【注意】
(1)结尾的 delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括 Space 和 Tab 缩进。
(2)开始的 delimiter 前后的空格会被忽略掉。
例如:
1 | !/bin/bash |
输出结果:
1 | Hello,World! |
4. /dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null 。 /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出”的效果。
1 | command > /dev/null 2>&1 # 屏蔽 stdout 和 stderr |