Linux 命令如何同时支持文件参数与管道输入?

文章目录

  • Linux 命令如何同时支持文件参数与管道输入?
    • 命令输入方式与管道机制概述
    • 常见输入控制方式
    • 常见使用示例
    • 程序实现思路:统一处理输入的方式
      • 判定输入来源的基本模式
      • 为何命令应支持参数与标准输入?
    • GNU Coreutils `wc` 源码解析:输入处理部分
      • 输入判断逻辑
      • 输入处理函数:`wc_file`
    • 参考资料

Linux 命令如何同时支持文件参数与管道输入?

命令输入方式与管道机制概述

在 Unix/Linux 系统中,许多命令(如 wc、cat、grep 等)既支持通过命令行参数指定读取文件,也支持从标准输入(stdin)读取数据。这使得它们既可以单独使用,也可以通过管道组合,形成强大的数据处理流水线。

常见输入控制方式

  1. 命令行参数读取文件
    当命令带有文件参数时,程序通常会打开并依次读取每个文件:

    grep foo logfile.txt
    wc -l file1.txt file2.txt
    
  2. 标准输入作为备用来源
    如果未提供文件名,命令会从标准输入(stdin)读取数据:

    cat logfile.txt | grep foo
    grep foo < logfile.txt
    
  3. 组合命令构建数据处理流
    这种设计理念支持命令的串联,例如:

    ps aux | grep nginx | wc -l
    
  4. “管道”传输机制
    使用 | 管道时:

    • 前一个命令的标准输出被重定向为后一个命令的标准输入;
    • 这依赖底层的文件描述符重定向(dup2())机制。

常见使用示例

在这里插入图片描述

例子含义说明
wc -l file.txt从文件读取,统计行数
`cat file.txtwc -l`
grep keyword file.txt从文件中查找关键字
grep keyword < file.txt从标准输入读取数据进行查找
`dmesggrep error

程序实现思路:统一处理输入的方式

为了支持这种灵活的使用方式,程序通常通过如下结构判断输入来源:

判定输入来源的基本模式

if (argc > 1) {// 有参数,视为文件路径fp = fopen(argv[1], "r");
} else {// 无参数,读取标准输入(管道/键盘)fp = stdin;
}

为何命令应支持参数与标准输入?

  • 用户可以根据场景自由选择输入来源;
  • 同一个工具既可用于交互,也可嵌入脚本或组合使用;
  • 遵循 UNIX 哲学中的:“程序应尽可能读取 stdin,输出到 stdout”。

GNU Coreutils wc 源码解析:输入处理部分

  • GNU wc 是一个成熟、功能全面的工具,支持统计行数、单词数、字节数等。其源码位于 GNU Coreutils 项目的 src/wc.c 文件中,命令行参数解析、输入来源判断、文件处理等逻辑集中于 main()wc_file() 函数。

  • 源码地址:https://github.com/coreutils/coreutils/blob/master/src/wc.c

输入判断逻辑

main() 函数最后,如果命令行没有指定任何文件名参数,程序将默认从标准输入读取:

if (ok && !files_from && argv_iter_n_args (ai) == 0)ok &= wc_file (nullptr, &fstatus[0]);

说明:

  • argv_iter_n_args(ai) == 0:表示命令行参数为空;
  • wc_file(nullptr, ...):传入 nullptr,进入标准输入处理分支。

输入处理函数:wc_file

static bool wc_file (char const *file, struct fstatus *fstatus)
{if (!file || STREQ(file, "-")) {// 从标准输入读取// ...省略return wc(STDIN_FILENO, file, fstatus, -1);} else {int fd = open(file, O_RDONLY | O_BINARY);// ...省略}
}

说明:

  • file == nullptr"file == "-"" 时,表示从标准输入读取;
  • 传递 STDIN_FILENO(标准输入文件描述符)给实际统计逻辑 wc()
  • 否则,使用 open() 打开文件并读取。

参考资料

  • GNU Coreutils 项目地址:https://github.com/coreutils/coreutils
  • Linux dup2 系统调用机制:man 2 dup2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flutter开发音乐APP(简单的音乐播放demo)

效果如下&#xff1a; 音乐播放界面 锁屏音乐播放展示 主要使用的插件如下 just_audio : 是一个功能丰富的音频播放器&#xff0c;适用于Android、iOS、macOS、Web、Linux和Windows平台。它提供了多种功能&#xff0c;包括从URL、文件、资产或字节流读取音频&#xff0c;支持D…

css中盒模型有哪些

标准盒模型&#xff08;w3c盒模型&#xff09; 在标准盒模型中&#xff0c;元素的width和height只包括内容区域&#xff0c;不包括内边距、边框、外边距。也就是元素的实际宽高是内容区域加上内边距、边框、外边距。 例如&#xff1a;一个元素的宽度设置为100px&#xff0c;内…

第3篇:请求参数处理与数据校验

在 Web 开发中&#xff0c;请求参数处理与数据校验是保障系统稳定性的第一道防线。本文将深入探讨 Egg.js 框架中参数处理的完整解决方案&#xff0c;涵盖常规参数获取、高效校验方案、文件流处理等核心功能&#xff0c;并分享企业级项目中的最佳实践。 一、多场景参数获取策略…

2025年-redis(p1-p10)

1.redis介绍 &#xff08;1&#xff09;基础&#xff1a;常见的数据结构及命令、jedis的应用和优化、springDataRedis的应用和优化 &#xff08;2&#xff09;企业实战的应用场景&#xff1a;共享session、缓存解决问题、秒杀中的redis应用、社交app中的redis应用、redis特殊结…

【AI模型学习】GPT——从v1到v3

文章目录 GPT-1GPT vs BERTGPT-2GPT-3Ai代码 GPT-1 GPT-1&#xff08;Generative Pretrained Transformer 1&#xff09;是 OpenAI 在2018年发布的第一个大规模预训练生成模型。它开创了基于 Transformer 的 预训练-微调 (pretraining-finetuning) 框架&#xff0c;在自然语言…

数字智慧方案6178丨智慧医院医疗信息化建设之以评促建(61页PPT)(文末有下载方式)

资料解读&#xff1a;智慧医院医疗信息化建设之以评促建 详细资料请看本解读文章的最后内容。 在当今数字化时代&#xff0c;医疗行业正经历着深刻变革&#xff0c;智慧医院的建设成为提升医疗服务质量、优化医疗资源配置的关键所在。这份智慧医院医疗信息化建设之以评促建的资…

浅谈C# record关键字

环境:.net8控制台 init关键字 通常我们会有一个常见的需求就是需要实现一个实例化后不可变的类型. 我通常会如下实现,将类的属性的set设为私有,这样只能使用构造函数来实例一个不可变对象. 但是如果内部再声明一个public的方法还是有可能会将我这个对象改变. internal class…

实时数仓dim层设计的一些疑惑点

0.dim层组件的选择 dim层存储要求&#xff1a;需要满足永久存储&#xff08;需要长期保存历史数据&#xff09;和支持根据主键查询单条数据明细&#xff0c;所以排除Kafka&#xff08;时效短&#xff09;&#xff1b; 候选框架&#xff1a;MySQL、Redis、Hive、Doris、HBase …

模型之FIM(Fill-In-the-Middle)补全

文章目录 模型之FIM(Fill-In-the-Middle)补全什么是FIM(Fill-In-the-Middle)FIM 的工作原理FIM 示例:代码补全场景常见模型fim 测试deepseek fim阿里completions 接口要判断模型是否支持特定的特殊标记**1. 模型可以自动推断生成区域****2. `suffix` 是可选的****3. 模型的…

使用CubeMX新建DMA工程——存储器到外设模式

目录 1、新建板级支持包 1、usart.c: 2、修改的地方&#xff1a;在usart.c中添加了这些 3、usart.h: 4、在usart.h中添加了这些&#xff1a; 5、dma.c: 6、dma.h: 2、修改main.c文件 1、在main.c文件中添加头文件 2、添加外部变量声明 3、添加简单延时函数 4、添加…

el-transfer穿梭框数据量过大的解决方案

一&#xff1a;背景 我们这个穿梭框获取的是项目的全量数据&#xff0c;在左边大概有5000条&#xff0c;自己测试了一下5000条数据的效果&#xff0c;发现异常的卡顿&#xff0c;本来打算像el-select一样去解决的&#xff08;只显示一部分&#xff0c;在搜索的时候去全量搜索&a…

2025年- H17-Lc125-73.矩阵置零(矩阵)---java版

1.题目描述 2.思路 &#xff08;1&#xff09;计算矩阵的行数 &#xff08;2&#xff09;计算矩阵的列数 &#xff08;3&#xff09;设计一个行列的bool数组 &#xff08;4&#xff09;遍历矩阵&#xff08;二维数组&#xff09;&#xff0c;如果遇到元素0&#xff0c;则把…

Qt二维码demo

使用QZXing库生成的二维码demo 运行结果 实现代码 c文件 #include "mainwindow.h" #include "ui_mainwindow.h" #include "src/myqrcodeheader.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui-&…

怪物猎人:世界-冰原10000+mod整合包5月最新更新!

700A大全套精美服装 800M大全套精美服装 3月31日更新 新增 新武器 新特效MOD 当前共计5800MOD整合包 好看的发型mod 实用的功能mod 炫酷的武器mod 新服装新特效新武器实用模组美化&#xff0c;等。 1月14日更新 新增皮肤MOD 500 当前共计2000MOD 1月16日更新 新增超…

华纳云:centos如何实现JSP页面的动态加载

JSP(JavaServer Pages)作为Java生态中常用的服务器端网页技术&#xff0c;具有动态内容生成、可扩展性强、与Java无缝结合等优势。 而CentOS作为一款稳定、高效、安全的Linux服务器操作系统&#xff0c;非常适合部署JSP应用。 想要让JSP页面实现动态更新加载&#xff0c;避免…

gradle-tasks.register(‘classesJar‘, Jar)解析

在使用gradle作为构建工具的android或者java web项目中&#xff0c;我们经常能遇到以下格式 tasks.register(classesJar, Jar) {from "$buildDir/intermediates/javac/release/classes" // 假设使用 release 构建变体 }artifact sourcesJar使用伪代码解释 class Cu…

数据处理1

一、常用数据处理模块Numpy Numpy常用于高性能计算&#xff0c;在机器学习常常作为传递数据的容器。提供了两种基本对象&#xff1a;ndarray、ufunc。 ndarray具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。 ufunc提供了对数组快速运算的标准数学函数。 ndar…

电力市场的交易品种

双边交易&#xff08;Bilateral Trading&#xff09; 定义&#xff1a;是电力市场中最基本的交易方式之一&#xff0c;指具备市场交易资格的买方和卖方&#xff0c;通过自主协商、双边协商的形式&#xff0c;确定交易电量、交易价格、交割曲线等交易要素&#xff0c;并签订中长…

uniapp 实现时分秒 分别倒计时

效果 <view class"issue-price-countdown"> <CountDown :endTimestamp"1745996085000"></CountDown> </view> 引入组件 import CountDown from /components/CountDown.vue; <template> <view class&qu…

从CRUD到复杂业务:AI自动生成电商优惠券叠加逻辑(新手救星指南)

在 Java 编程的广阔天地中,据统计,高达 80% 的新手会在业务逻辑编写环节陷入困境。业务逻辑作为软件系统的核心灵魂,承载着从用户需求到代码实现的关键转化过程,为何却成为新手难以逾越的 “鸿沟”?飞算 JavaAI 的出现,又将如何打破这一僵局? 一、Java 新手卡在业务逻辑的根…