在 Linux
中一个命令的去向可以有3个地方:终端、文件、作为另外一个命令的入参。
命令一般都是通过键盘输入,然后输出到终端、文件等地方,它的标准用是 stdin
、 stdout
以及 stderr
。
- 标准输入
stdin
,终端接收键盘输入的命令,会产生两种输出; - 标准输出
stdout
,终端输出的信息(不包含错误信息); - 标准错误输出
stderr
,终端输出的错误信息。
1. 重定向
一般命令的输出都会显示在终端中,有些时候需要将一些命令的执行结果想要保存到文件中进行后续的分析/统计,则这时候需要使用到的输出重定向,即把本来要显示在终端的命令结果,输送到别的地方(到文件中或者作为其他命令的输入)。
输出重定向 >
>
表示重定向到新的文件, cut \-d , \-f 1 notes.csv > name.csv
,它表示通过逗号剪切 notes.csv
文件(剪切完有3个部分)获取第一个部分,重定向到 name.csv
文件。
【注意】使用 >
要注意,如果输出的文件不存在它会新建一个,如果输出的文件已经存在,则会覆盖。因此执行这个操作要非常小心,以免覆盖其它重要文件。
输出重定向 >>
表示重定向到文件末尾,因此它不会像 >
命令这么危险,它是追加到文件的末尾(当然如果文件不存在,也会被创建)。例如,执行 cut \-d , \-f 1 notes.csv >> name.csv
,则会把名字追加到 name.csv
里面。
输出重定向 2>
标准错误输出
cat not_exist_file.csv > res.txt 2> errors.log
- 当
cat
一个文件时,会把文件内容打印到屏幕上,这个是标准输出; - 当使用了
> res.txt
时,则不会打印到屏幕,会把标准输出写入文件res.txt
文件中; 2> errors.log
当发生错误时会写入errors.log
文件中。
输出重定向 2>>
标准错误输出(追加到文件末尾)同 >>
相似。
输出重定向 2>&1
标准输出和标准错误输出都重定向都一个地方:
cat not_exist_file.csv > res.txt 2>&1 # 覆盖输出
cat not_exist_file.csv >> res.txt 2>&1 # 追加输出
例如:
CUDA_VISIBLE_DEVICES=0 nohup python -u train.py > train.log 2>&1 &
2>&1:将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 log 文件中。
- 0 – stdin (standard input,标准输入)
- 1 – stdout (standard output,标准输出)
- 2 – stderr (standard error,标准错误输出)
输入重定向 <
<
符号用于指定命令的输入。
cat < name.csv # 指定命令的输入为 name.csv
虽然它的运行结果与 cat name.csv
一样,但是它们的原理却完全不同。
cat name.csv
表示cat
命令接收的输入是notes.csv
文件名,那么要先打开这个文件,然后打印出文件内容。cat < name.csv
表示cat
命令接收的输入直接是notes.csv
这个文件的内容,cat
命令只负责将其内容打印,打开文件并将文件内容传递给cat
命令的工作则交给终端完成。
输入重定向 <<
将键盘的输入重定向为某个命令的输入。
sort -n << END # 输入这个命令之后,按下回车,终端就进入键盘输入模式,其中END为结束命令(这个可以自定义)
wc -m << END # 统计输入的单词
2. 管道 |
把两个命令连起来使用,一个命令的输出作为另外一个命令的输入,英文是 pipeline
,可以想象一个个水管连接起来,管道算是重定向流的一种。
cut -d , -f 1 name.csv | sort > sorted_name.txt
# 第一步获取到的 name 列表,通过管道符再进行排序,最后输出到sorted_name.txt
du | sort -nr | head
# du 表示列举目录大小信息
# sort 进行排序,-n 表示按数字排序,-r 表示倒序
# head 前10行文件
grep log -Ir /var/log | cut -d : -f 1 | sort | uniq
# grep log -Ir /var/log 表示在log文件夹下搜索 /var/log 文本,-r 表示递归,-I 用于排除二进制文件
# cut -d : -f 1 表示通过冒号进行剪切,获取剪切的第一部分
# sort 进行排序
# uniq 进行去重
3. 流
流就是读一点数据, 处理一点点数据。其中数据一般就是二进制格式。 上面提及的重定向或管道,就是把数据当做流去运转的。