每天一个 Linux 知识:什么是重定向?

B站影视 日本电影 2025-10-31 09:25 1

摘要:标准输入(stdin):编号0,是命令获取数据的来源,默认指向键盘。例如执行cat命令时,输入的文本就来自标准输入;标准输出(stdout):编号1,是命令执行后产生的正常结果,默认指向终端屏幕。例如ls命令列出的文件列表、date命令显示的当前时间,都通过标

要掌握重定向,首先需明确Linux中命令的三个核心“数据流”(简称“三流”),它们是重定向操作的对象:

Linux系统为每个命令默认分配了三个数据流,并用数字编号标识(便于重定向时指定目标):

标准输入(stdin):编号0,是命令获取数据的来源,默认指向键盘。例如执行cat命令时,输入的文本就来自标准输入;标准输出(stdout):编号1,是命令执行后产生的正常结果,默认指向终端屏幕。例如ls命令列出的文件列表、date命令显示的当前时间,都通过标准输出呈现;标准错误(stderr):编号2,是命令执行过程中产生的错误信息,默认也指向终端屏幕。例如ls /nonexistent(访问不存在的目录)时,输出的“无法访问”提示,就来自标准错误。

默认情况下,标准输出与标准错误都显示在终端,难以区分;标准输入依赖键盘,无法重复利用输入内容。重定向的本质,就是通过特殊符号“修改”这三个数据流的指向——将输入从键盘改为文件,将输出从屏幕改为文件,或让错误信息单独存放。

定向通过特定符号实现,不同符号对应不同的数据流操作,核心符号如下表所示:

符号作用描述对应数据流示例覆盖输出:将标准输出写入文件,覆盖原有内容stdout(1)ls > filelist.txt追加输出:将标准输出写入文件,追加到末尾stdout(1)echo "new line" >> log.txt输入重定向:将文件内容作为标准输入stdin(0)cat 2>覆盖错误输出:将标准错误写入文件,覆盖内容stderr(2)ls /nonexistent 2> error.log2>>追加错误输出:将标准错误写入文件,追加内容stderr(2)python script.py 2>> err.log&>/>&合并输出:将标准输出与标准错误一起写入文件stdout+stderrcommand &> all.log

根据操作对象的不同,重定向可分为“输出重定向”“输入重定向”“错误输出重定向”三类,每类都有明确的适用场景,以下结合实例详解其用法。

输出重定向是最常用的类型,用于将命令的正常结果(标准输出)保存到文件,而非显示在终端。核心符号为>(覆盖)和>>(追加),需根据是否保留文件原有内容选择。

当需要用命令结果“替换”已有文件内容,或“新建文件并保存结果”时,使用>。例如:

# 将ls命令的输出(当前目录文件列表)写入filelist.txt,若文件已存在则覆盖ls -l > filelist.txt# 将date命令的输出(当前时间)写入current_time.txt,新建文件(若不存在)date > current_time.txt

注意:>会直接覆盖文件原有内容,若文件中存在重要数据,需谨慎使用(建议先用cat查看文件内容)。

当需要在文件末尾“追加”新内容,而非覆盖原有数据时,使用>>。例如:

# 将当前时间追加到log.txt末尾,不影响已有内容date "+%Y-%m-%d %H:%M:%S" >> log.txt# 将系统进程信息追加到process.log,用于持续记录进程状态ps aux >> process.log

典型场景:日志记录——运行脚本或服务时,用>>将每次的执行结果追加到日志文件,便于后续查看历史记录。

输入重定向(

例如,cat命令默认从键盘读取输入(输入文本后按Ctrl+D结束),通过

# 等价于cat readme.txt,将readme.txt的内容作为cat的输入,输出到终端cat

更实用的场景是“批量执行命令”:若将一系列命令写入commands.txt(每行一条命令),可通过bash

# commands.txt内容:# echo "start"# ls -l /home# echo "end"# 批量执行commands.txt中的命令bash

若输入内容较短,无需单独创建文件,可通过“HERE文档”(

# 将"line1" "line2" "line3"作为cat的输入,写入output.txtcat > output.txt

执行后,output.txt会包含嵌入的三行内容,适合快速生成包含多行文本的文件(如配置文件、脚本注释)。

默认情况下,标准错误(如命令执行失败的提示)与标准输出一起显示在终端,难以区分和排查。通过2>(覆盖)和2>>(追加),可将错误信息单独保存到文件,便于后续分析错误原因。

例如,访问不存在的目录时,将错误信息写入error.log:

# 将ls /nonexistent的错误信息(标准错误)写入error.log,覆盖原有内容ls /nonexistent 2> error.log# 运行Python脚本,将报错信息追加到script_err.log(不覆盖历史错误)python test.py 2>> script_err.log

执行后,终端无错误显示(错误已被重定向到文件),可通过cat error.log查看具体错误信息。

若需将命令的“正常结果”与“错误信息”一起保存到同一个文件,可使用&>(合并覆盖)或&>>(合并追加):

# 将python script.py的正常输出和错误信息一起写入all.log,覆盖原有内容python script.py &> all.log# 将系统更新命令的输出(包括进度和错误)追加到update.logsudo apt update &>> update.log

也可通过1>&2(将标准输出重定向到标准错误)或2>&1(将标准错误重定向到标准输出)实现更灵活的合并,例如:

# 将标准错误重定向到标准输出,再一起追加到all.log(等价于&>>)command >> all.log 2>&1

来源:wljslmz一点号

相关推荐