6月3日 00:11
Linux 管道和重定向怎么用?| > >> 2>&1 详解
管道(|)把一个命令的输出传给另一个命令做输入。重定向(> >> 2>&1)控制输出到文件还是设备。两者配合是 Linux 命令行最核心的组合能力。
重定向
标准输出重定向
bashls > file.txt # 覆盖写入 ls >> file.txt # 追加写入
会清空文件再写入,>> 在文件末尾追加。新手常犯的错:用 > 覆盖了重要文件。
标准错误重定向
bashgcc main.c 2> errors.log # 只重定向错误
Linux 有三个标准流:stdin(0)、stdout(1)、stderr(2)。2> 就是重定向文件描述符 2(标准错误)。
同时重定向输出和错误
bash# 输出和错误都写到同一个文件 gcc main.c > output.log 2>&1 # 更简洁的写法(bash 4+) gcc main.c &> output.log
2>&1 把 stderr 合并到 stdout。顺序重要:> output.log 2>&1 正确,2>&1 > output.log 错误(stderr 去了终端而不是文件)。
丢弃输出
bashgcc main.c > /dev/null 2>&1 # 什么都不看 gcc main.c 2> /dev/null # 只看正常输出,忽略错误
/dev/null 是黑洞设备,写入的数据全部丢弃。
管道
bash# 找出占用内存最多的 5 个进程 ps aux | sort -k4 -rn | head -5 # 统计当前目录下各类型文件数量 ls | grep -o '\..*$' | sort | uniq -c | sort -rn # 在日志中搜索错误并提取时间 grep ERROR app.log | awk '{print $1, $2}'
管道把前一个命令的 stdout 变成后一个命令的 stdin。注意:管道只传 stdout,不传 stderr。如果要传 stderr,先 2>&1。
常见组合
bash# 查找大文件 du -sh * | sort -rh | head -10 # 统计代码行数 find . -name '*.py' | xargs wc -l | tail -1 # 批量替换文件内容 grep -rl 'old_text' . | xargs sed -i 's/old_text/new_text/g' # 监控日志中的错误 tail -f app.log | grep --line-buffered ERROR
Here Document
bashcat > config.yaml << EOF server: port: 8080 host: localhost EOF
<< EOF 把多行文本作为 stdin,常用于写配置文件或脚本内嵌数据。