Linux >、>>输出重定向

标准流

Linux 程序默认有3个标准流:

  • stdout 标准输出(屏幕,编号1)
  • stderr 标准错误输出(屏幕,编号2)
  • stdin 标准输入(键盘,编号0)

输出重定向

把本来打印到屏幕的内容,转到文件里,而不是终端。

  • > 覆盖写入(先清空文件,再写内容)
  • >> 追加写入(在文件末尾新增内容,不覆盖原有内容)

1. > 覆盖重定向(截断输出)

语法:

命令 > 文件名

特点:

  1. 如果文件不存在:自动新建文件
  2. 如果文件已存在:直接清空原有全部内容,再写入命令输出

⚠️ 风险:容易误删文件内容!

示例

# 将ls的结果写入test.txt,覆盖原有内容
ls -l > test.txt

# 清空一个文件(常用小技巧,把空输出覆盖进去)
> test.txt

2. >> 追加重定向(追加输出)

语法:

命令 >> 文件名

特点:

  1. 文件不存在:新建
  2. 文件存在:在文件末尾添加内容,原有内容保留

示例

# 第一次写入
echo "第一行" >> log.txt
# 继续追加一行,不会删掉第一行
echo "第二行" >> log.txt

3. 标准错误 stderr 重定向

> 默认只重定向标准输出stdout,报错信息(stderr)仍然打印屏幕。

  • 2>:错误覆盖
  • 2>>:错误追加
# 把错误信息覆盖写入err.log,正常输出依旧屏幕
cat nofile.txt 2> err.log

# 错误追加到err.log
cat nofile.txt 2>> err.log

4. 同时把正常输出+错误输出写到同一个文件

# 方式1(推荐,bash)
命令 > all.log 2>&1

# 方式2(简写,新版bash支持)
命令 &> all.log

2>&1 含义:把2号错误流,重定向到1号输出流的目标

5. 常用组合示例

# 1. 输出到文件,屏幕不显示
echo hello > a.txt

# 2. 多次追加日志
date >> run.log
echo "执行完毕" >> run.log

# 3. 屏蔽所有输出(丢进黑洞 /dev/null)
command > /dev/null 2>&1

6. 容易踩坑的要点

  1. 重定向符号位置:符号后面跟文件名,不能放命令参数中间
    # ✅
    echo abc > file.txt
    # ❌ 错误
    echo > file.txt abc
    
  2. > 清空文件是打开文件那一刻就清空,不是命令执行完。
  3. echo 输出默认自带换行;echo -n 不换行写入。
  4. 权限问题:如果当前用户没有文件所在目录写入权限,会报 Permission denied。

7. 对比总结表

符号 名称 作用 文件存在时
> 覆盖重定向 stdout写入文件 清空原有内容
>> 追加重定向 stdout写入文件末尾 保留原有内容,末尾新增
2> 错误覆盖 stderr写入文件 清空
2>> 错误追加 stderr写入文件末尾 追加
&> 全部输出覆盖 stdout+stderr一起写入 清空

原文出处:/show_1GW42fJz3j2D.html