当前位置: 首页 > news >正文

Linux 标准输入 标准输出 标准错误

目录

  • 一. 简介
  • 二. 常见用法
    • 2.1 输出重定向
    • 2.2 错误重定向
    • 2.3 同时重定向标准输出 + 错误
    • 2.4 输入重定向
    • 2.5 特殊设备
  • 三. 这样设计的好处
    • 3.1 区分正常信息和错误信息
    • 3.2 方便调用方脚本处理
    • 3.3 与管道结合时更清晰
  • 四. 案例
    • 4.1 if判断
    • 4.2 ls查询


一. 简介

⏹在 Linux/Unix 中,一切都是文件(文件、目录、设备、管道、网络套接字等)。
当进程打开一个文件(或设备、socket 等),内核会返回一个 整数编号 来代表它,这个编号就是 FD
File Descriptor(文件描述符)的简写。

进程之后对这个文件的所有操作(读、写、关闭等)都是通过FD文件描述符来完成的。

FD名称说明默认指向
0stdin标准输入键盘
1stdout标准输出终端屏幕
2stderr标准错误终端屏幕

二. 常见用法

2.1 输出重定向

写法含义
command > file标准输出写入文件,覆盖
command >> file标准输出追加到文件
command 1> file等同于 > file,指定 stdout

2.2 错误重定向

写法含义
command 2> file标准错误写入文件
command 2>> file标准错误追加到文件
command 2>&1stderr 重定向到 stdout 的位置

2.3 同时重定向标准输出 + 错误

写法含义
command > file 2>&1stdout 和 stderr 都写入 file
command &> fileBash专用简写,stdout+stderr 一起写入 file
command &>> filestdout+stderr 一起追加到 file

2.4 输入重定向

写法含义
command < file把文件作为标准输入
command 0< file等同于 < file

2.5 特殊设备

写法含义
>/dev/null丢弃 stdout
2>/dev/null丢弃 stderr
&>/dev/null丢弃 stdout + stderr(Bash常用,不兼容sh)
💥>/dev/null 2>&1丢弃 stdout + stderr(兼容所有shell)

三. 这样设计的好处

3.1 区分正常信息和错误信息

  • stdout 通常表示程序的正常结果(比如命令执行的输出)。
  • stderr 用来提示警告、错误、用户输入异常等情况。
echo "正常结果"      # 发到 stdout
echo "出错了!" >&2  # 发到 stderr

3.2 方便调用方脚本处理

  • 上层脚本或调用者可以分别捕获 stdout 和 stderr。
./myscript.sh >output.log 2>error.log

3.3 与管道结合时更清晰

  • 管道| 只会传递 stdoutstderr 会被分开。
  • 如果 command1 里错误信息走 stderr,它就不会影响后面的数据处理逻辑。
command1 | command2

四. 案例

4.1 if判断

⏹判断指定的环境变量是否存在

  • >/dev/null 2>&1:用于将printenv USERNAME的标准输出和错误全部丢弃
# 兼容所有shell的写法
if printenv USERNAME >/dev/null 2>&1; thenecho "环境变量 USERNAME 存在"
elseecho "环境变量 USERNAME 不存在"
fi# bash专用的写法
if printenv USERNAME &>/dev/null; thenecho "环境变量 USERNAME 存在"
elseecho "环境变量 USERNAME 不存在"
fi

⏹判断指定的命令是否存在

if ! command -v keytool >/dev/null 2>&1; thenecho "【keytool】命令并没有被安装, 请确认!"exit 1
fi

4.2 ls查询

  • 有2个文件夹,其中0915的文件夹只有root用户才能读取其中的文件
  • 直接ls -l 09*查看时,会提示权限不足
  • 2>/dev/null将标准错误丢弃之后,屏幕上不会显示错误提示
apluser@FengYeHong-HP:work$ ls -ld 09*
drwx------ 2 root    root    4096 Sep 15 18:58 0915
drwxr-xr-x 2 apluser apluser 4096 Sep 15 19:00 0915_01
apluser@FengYeHong-HP:work$
apluser@FengYeHong-HP:work$ ls -l 09*
ls: cannot open directory '0915': Permission denied
0915_01:
total 0
apluser@FengYeHong-HP:work$
apluser@FengYeHong-HP:work$ ls -l 09* 2>/dev/null
0915_01:
total 0
  • ls 09* >out.txt 2>err.txt:stdout 到 out.txt,stderr 到 err.txt
apluser@FengYeHong-HP:work$ ls 09*
ls: cannot open directory '0915': Permission denied
0915_01:
apluser@FengYeHong-HP:work$
apluser@FengYeHong-HP:work$ ls 09* >out.txt 2>err.txt
apluser@FengYeHong-HP:work$
apluser@FengYeHong-HP:work$ cat out.txt
0915_01:
apluser@FengYeHong-HP:work$
apluser@FengYeHong-HP:work$ cat err.txt
ls: cannot open directory '0915': Permission denied
  • ls 09* >all_info.txt 2>&1:stdout 和 stderr 都输出到 all.txt
apluser@FengYeHong-HP:work$ ls 09* >all_info.txt 2>&1
apluser@FengYeHong-HP:work$
apluser@FengYeHong-HP:work$ cat all_info.txt
ls: cannot open directory '0915': Permission denied
0915_01:
http://www.dtcms.com/a/385621.html

相关文章:

  • 【减少丢帧卡顿——状态管理】
  • pytest 常用方法介绍
  • 牛客周赛 Round 109 (小红的直角三角形
  • 【C++实战⑬】解锁C++文件操作:从基础到实战的进阶之路
  • 股票进阶之成交量买卖法
  • 【LangChain指南】Prompt templates
  • CSS基础 - 选择器备忘录 --笔记5
  • Vue-30-利用Vue3大模型对话框设计之切换主题时显示对应的session列表
  • 全光谱 LED 太阳光模拟器的原理
  • 权限更改centos中系统文件无法创建文件夹,使用命令让普通用户具备操作文件夹
  • 【WebGIS】Vue3使用 VueLeaflet + 天地图 搭建地图可视化平台(基础用法)
  • 69-SQLite应用
  • Day06 双指针扫描 | 11. 盛最多水的容器
  • LeetCode 刷题【77. 组合、78. 子集、79. 单词搜索】
  • Jenkins 构建清理策略:自带功能 vs Discard Old Build 插件,全场景实操指南
  • DevOps历程-Gogs的安装与部署
  • FreeRTOS 任务静态创建与句柄详解
  • 嵌入式音视频开发——RTMP协议详解
  • 每日一题(6)
  • 信号量主要API及综合应用
  • 【开题答辩全过程】以 B站用户视频喜好倾向数据分析系统为例,包含答辩的问题和答案
  • ARM架构学习6.2——中断理解
  • 搭建Qt5.14.2+msvc2017_x64项目测试Opencv4.10功能
  • Steger 算法 的原理和流程
  • WD5030K:一款7-30V宽输入范围、12A高效同步降压DC-DC转换器芯片详解
  • 《2025年AI产业发展十大趋势报告》五十七
  • 滴滴试点返程费自主议价将会怎么改变市场?
  • 【嵌入式原理系列-第八篇】USART从原理到配置全解析
  • Python4-seaborn
  • 使用 Aamzon Step Functions 重构无服务器工作流