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
3
4
# 命令行中执行
who > file_user # 将命令完整的输出重定向在用户文件中(file_user)
date >> file_user # 将日期追加到file_user文件结尾
ls ~ > file_user # 清空file_user,将家目录中所有文件的名称重定向到file_user文件

运行结果如下图:

2.输入重定向

2.1输入重定向的概念

Unix 命令也可以从文件获取输入,而不是默认的键盘

命令 说明
command < file 本来需要从键盘获取输入的命令会转移到文件file中读取内容。

2.2使用实例

1
2
3
# 命令行中执行
wc -l file_user
wc -l < file_user

运行结果如下图:

第一个命令没有进行重定向,会输出文件名;第二个命令却不会,因为第二个命令仅仅知道从标准输入读取内容。

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
2
command 2 > file # 清空原文件再写入
command 2 > file # 追加到原文件后面

3.4 stdout 和 stderr 合并后重定向到 file

1
2
command > file 2>&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
2
3
4
# 将两个 delimiter 之间的内容(document) 作为输入传递给 command
command << delimiter
document
delimiter

【注意】

(1)结尾的 delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括 Space 和 Tab 缩进。

(2)开始的 delimiter 前后的空格会被忽略掉。

例如:

1
2
3
4
5
#!/bin/bash
cat << tag
Hello,World!
qidaink
tag

输出结果:

1
2
Hello,World!
qidaink

4. /dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null 。 /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出”的效果。

1
command > /dev/null 2>&1 # 屏蔽 stdout 和 stderr