0

0

Linux shell 输入输出重定向技巧

舞姬之光

舞姬之光

发布时间:2026-02-13 16:37:22

|

412人浏览过

|

来源于php中文网

原创

重定向符号顺序错误会导致执行失败:如> file.txt hello.txt将字面量"hello.txt"写入而非读取文件;正确应为cat hello.txt > file.txt;2>&1必须置于>之后,否则stderr无法捕获。

linux shell 输入输出重定向技巧

重定向符号写错顺序会直接执行失败

Linux 里 > 看似对称,但位置错了命令就不是你想要的——比如 <code>cat > file.txt hello.txt 不会把 hello.txt 内容写进 file.txt,而是把字面量 hello.txt 当作字符串输出进去。因为 shell 把 > 后面紧挨的内容当成目标文件,其余参数全当 cat 的输入参数(而 cat 没指定输入源时读 stdin)。

正确写法是:cat hello.txt > file.txtcat file.txt。注意: 必须紧跟在命令后或参数之间,不能塞在中间;<code>>>> 只能出现在命令行末尾或重定向链中靠后位置。

  • 2>&1 要写在 > 后面,否则 stderr 不会被捕获:用 command > out.txt 2>&1,别写成 command 2>&1 > out.txt(后者 2>&1 指向的是原始 stdout,还没被重定向)
  • 2>/dev/null 单独使用没问题,但和 > 组合时,顺序错会导致静默丢数据
  • bash 4.0+ 支持 &>file 简写等价于 >file 2>&1,但老系统或 dash/sh 下不认,别无脑用

exec 持久重定向整个 shell 会话

临时重定向只影响单条命令,想让后续所有命令输出都进日志?得靠 exec。它不是执行新进程,而是修改当前 shell 的 fd 映射——所以生效后连 echols 都走新路径。

常见误操作是漏掉 fd 编号或搞混方向:exec > log.txt 把 stdout(fd 1)重定向到文件;exec 3>tmp.txt 是开一个新 fd 3,不干扰默认流;exec 2>&1 才是把 stderr 接到当前 stdout(此时若 stdout 已被重定向,stderr 就也进去了)。

  • 要同时重定向 stdout 和 stderr 到同一文件:先 exec > log.txt,再 exec 2>&1(顺序不能反)
  • 恢复默认终端输出:用 exec > /dev/tty 2>/dev/tty,别试 exec > /dev/stdout——那只是个符号链接,可能已被改写
  • 脚本开头加 exec 3>&1 可保存原始 stdout,之后用 echo "debug" >&3 输出到终端,不影响主流程重定向

tee 分流时 -a 参数决定是否覆盖

tee 看似简单,但默认行为是覆盖文件,跟 > 一样;想追加得显式加 -a。很多人写 cmd | tee log.txt,跑两次后发现只有第二次结果——因为第一次的 log 被清空了。

另一个坑是管道中断导致 tee 提前退出,上游命令却还在写,可能触发 SIGPIPE。比如 yes | tee /tmp/junk.txt,手动 killall teeyes 进程常卡住不动(实际是被信号终止,但现象像卡死)。

  • 需要追加日志:用 cmd | tee -a log.txt,别依赖默认行为
  • 既要屏幕输出又要存两份不同格式?cmd | tee log.txt | grep "ERROR" —— 注意 tee 的 stdout 是管道,不是终端,所以第二段命令才能继续处理
  • 避免 tee 成为瓶颈:大数据量时加 --output-error=exit 让它出错立刻报,而不是默默丢数据

重定向到不存在目录会报错,mkdir -p 不能自动补救

command > /path/to/log/file.log 前,shell 不会帮你建中间目录。报错不是 No such file or directory,而是更迷惑的 No such file or directory(提示的是文件路径整体不可写),新手常以为是权限问题,其实只是 /path/to/log/ 根本不存在。

有人想用 mkdir -p $(dirname /path/to/log/file.log); command > /path/to/log/file.log,但要注意 $(dirname ...) 在重定向解析前就执行了,如果路径含变量或命令替换,得用子 shell 或提前展开。

  • 安全做法:先 mkdir -p /path/to/log,再重定向;或者用 set -o pipefail 配合 if 判断目录是否存在
  • 脚本里别写 command > $(mktemp) 就完事——临时文件没清理,且 mktemp 返回路径带换行或空格时会崩
  • zsh 用户注意:cd foo && command > ../bar/out.log 中的 ../bar 是相对于原工作目录还是当前?答案是原目录——重定向路径解析不随 cd 实时更新

重定向看着只是加几个符号,但 fd 层、shell 解析顺序、子进程继承规则全在底下咬着。最常翻车的地方不是语法记错,而是以为“它该懂我的意图”,结果它只认字面意思。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

244

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

706

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

807

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

326

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

529

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1552

2023.10.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

15

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9万人学习

Git 教程
Git 教程

共21课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号