linux下有一个强大的命令|(管道提示符).它的作用是将前一个命令的结果交给后一条命令并作为后一条命令的输入.而linux下的大多数命令也都支持这种方式.可是当笔者写完一个php的命令行小程序以后,对于怎样获得前一个命令的结果却陷入了僵局.难道php不支持这样的操作?
      于是又开始问google大叔.找来找去,都是说php的命令行模式是怎么回事儿,也没有和我想知道的问题相关的资料.难道是俺的关键字用的不对?或者是传说的RP问题?google无果以后,开始想找人求助.我认识的做php的朋友中,谁可能会做过命令的程序呢,然后问.问来问去都说没玩过或者不熟悉.又是无果,哎,真急死人.看来只能靠自己了,于是开始自救.于是开始研究php的argc和argv,试来试去都不行.开始静下心来细细思考怎么回事儿.隐约记得以前玩perl的时候,想获得输入用的是一个'<>'来完成的.而'<>'代表从标准输入读东西的意思.再想想管道符的作用不就是代替人输入东西嘛.思路打开了,于是有了下面这段小程序:

  1. [rainbird@rainbird-desktop ~]$cat a.php
  2. #!/usr/bin/php -q
  3. <?php
  4. $fh = fopen('php://stdin','r');
  5. echo fgets($fh);
  6. fclose($fh);
  7. ?>
  8. [rainbird@rainbird-desktop ~]$echo "aaaaa"|./a.php
  9. aaaaa

呵呵,成功搞定!但是这样的话,有一个小问题:

  1. [rainbird@rainbird-desktop ~]$tail /etc/passwd|./a.php
  2. couchdb:x:106:113:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash

一次只能读入一行!看来是fgets的问题了.怎么样才可以一下子把所有的内容读过来呢?在使用php的过程中,我知道,如果想一下子把一个文件的内容放在一个变量而不是数组的话用:file_get_contents.但是它是对文件操作的,不知道是不是适合标准输入.不知道可以试一下嘛.看结果:

  1. [rainbird@rainbird-desktop ~]$cat a.php
  2. #!/usr/bin/php -q
  3. <?php
  4. echo file_get_contents('php://stdin');
  5. ?>
  6. [rainbird@rainbird-desktop ~]$tail /etc/passwd|./a.php
  7. couchdb:x:106:113:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash
  8. haldaemon:x:107:114:Hardware abstraction layer,,,:/var/run/hald:/bin/false
  9. speech-dispatcher:x:108:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/sh
  10. kernoops:x:109:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
  11. saned:x:110:116::/home/saned:/bin/false
  12. pulse:x:111:117:PulseAudio daemon,,,:/var/run/pulse:/bin/false
  13. gdm:x:112:119:Gnome Display Manager:/var/lib/gdm:/bin/false
  14. rainbird:x:1000:1000:rainbird,,,:/home/rainbird:/bin/bash
  15. sshd:x:113:65534::/var/run/sshd:/usr/sbin/nologin
  16. postfix:x:114:122::/var/spool/postfix:/bin/false

真帅!搞定.就这么简单的几行,php就简单实现了cat的功能:

  1. [rainbird@rainbird-desktop ~]$./a.php </etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. daemon:x:1:1:daemon:/usr/sbin:/bin/sh
  4. bin:x:2:2:bin:/bin:/bin/sh
  5. sys:x:3:3:sys:/dev:/bin/sh
  6. sync:x:4:65534:sync:/bin:/bin/sync
  7. ......

对php开始由衷的折服.php也开始融入了linux一切皆文件的思想,竟可以把标准输入作为一个文件来处理.细细想来:其实这是一个简单的小问题,只是因为没有做过这样一个事情,思维受到了限制,当接触这样一个需求的时候一下子不知道应该怎么思考.用perl,python,ruby做程序的同学们再遇到这样的需求知道怎么处理了吧:)这个小经历再次印证:程序是算法的表达方式,算法是灵魂,有思路才有出路.

转载于:https://blog.51cto.com/rainbird/279495

让你的php命令行程序处理管道数据相关推荐

  1. php管道的概念,让你的php命令行程序处理管道数据

    linux下有一个强大的命令|(管道提示符).它的作用是将前一个命令的结果交给后一条命令并作为后一条命令的输入.而linux下的大多数命令也都支持这种方式.可是当笔者写完一个php的命令行小程序以后, ...

  2. 基于Golang的CLI 命令行程序开发

    基于Golang的CLI 命令行程序开发 [阅读时间:约15分钟] 一. CLI 命令行程序概述 二. 系统环境&项目介绍&开发准备 1.系统环境 2.项目介绍 3.开发准备 三.具体 ...

  3. 命令行程序增加 GUI 外壳

    Conmajia © 2012 Updated on Feb. 21, 2018 命令行大家都用过: 图 1 命令行程序工作界面 现在想办法为它做一个 GUI 外壳,实际效果参考图 2. 图 2 带 ...

  4. myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)

    1.Github项目地址 https://github.com/baiyexing/myapp.git 2.功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 功能(已全部实现) 使用 -n ...

  5. python命令行大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

  6. ffmpeg mp4 提取h265命令行_安装FFmpeg多媒体库,以及命令行程序使用介绍

    FFmpeg是非常流行的多媒体框架,主要用于音视频的解码.编码.转码.混流.过滤.播放等操作. 2000年,法国著名的程序员Fabrice Bellard创建FFmpeg项目,前两个字母FF是Fast ...

  7. java 打印命令_Java 普通命令行程序main关掉 DEBUG 打印

    最近在写一个简单的java命令行程序,执行代码时,代码窗口出现了烦人的debug日志. 分析了一下,出现这种问题的原因是因为,maven项目的依赖包中传递依赖了一些日志框架,导致会出现日志内容的打印. ...

  8. 命令逐行显示_在LoadRunner中执行命令行程序之:popen()取代system()

    >>>推荐阅读<<< 1.性能测试学习笔记-场景设计 2.性能测试的重要意义 3.性能分析流程及方法 4.应用系统性能调优之性能分析 在LoadRunner中执行命 ...

  9. c语言程序命令行,ttyd(C语言编写的命令行程序) v1.3.1 免费版

    ttyd是一个C语言编写的命令行程序,可以把任意命令行程序分享到网页上操作,可以看做是个网页版的远程终端,支持 Linux.macOS 系统,还可以运行在 OpenWrt 之类的嵌入式系统上. 功能特 ...

最新文章

  1. ARCGIS中某字段递增赋值
  2. Linux中查看端口占用情况及结束相应进程
  3. 代理服务器之正向代理和反向代理
  4. centos7安装mysql日志空白_centos7安装Mysql爬坑记录 - G
  5. 【阿里妈妈营销科学系列】开篇:C.M.O——“人群.渠道.机会”营销分析导论
  6. Spring Boot框架敏感信息泄露的完整介绍与SRC实战(附专属字典与PoC)
  7. php mysql关键技术_中高级PHP开发者应该掌握哪些技术?
  8. Springboot记录
  9. DIP、IoC、DI笔记整理
  10. C# COM Object for Use In JavaScript / HTML, Including Event Handling(转载)
  11. Idea2020版本设置编码格式
  12. python自动化交易通达信_通达信实现自动交易系统
  13. 优秀的 HTML5 网站设计案例欣赏
  14. 输入日期得出星座c语言,根据日期计算星座
  15. 如何将手机中Word文档转换成PDF
  16. 不需要抓包分析、简单粗暴的模拟校园网登录方法——基于python playwright
  17. 寒江独钓第3章——串口过滤
  18. 【全】常见的空气净化技术,你知道几种类型?
  19. VR升级换代正当时:Pico G2 4K评测体验
  20. 浪涌保护器:保护电子设备免受雷击侵害

热门文章

  1. java IO(四):键盘录入
  2. maven 学习---Maven本地资源库
  3. Linux忘记root密码怎么办?
  4. WSSv3 Technical Articles_Windows SharePoint Services 3.0编码开发工具和技巧(Part 2 of 2)
  5. Simulink之电网电压换流式有源逆变电路
  6. Cortex-M3异常中断及向量表定义
  7. *p++和*++p_2020年P气瓶充装新版试题及P气瓶充装找答案
  8. 不得不说,其实你的性能优化手段已经过时了
  9. 太强了,300分钟撸一个基于redis的亿级用户高并发系统
  10. 漫话:为什么程序员喜欢使用0 ≤ i 10这种左闭右开的形式写for循环?