linux下有一个强大的命令|(管道提示符).它的作用是将前一个命令的结果交给后一条命令并作为后一条命令的输入.而linux下的大多数命令也都支持这种方式.可是当笔者写完一个php的命令行小程序以后,对于怎样获得前一个命令的结果却陷入了僵局.难道php不支持这样的操作?

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

[rainbird@rainbird-desktop ~]$cata.php

#!/usr/bin/php -q

$fh=fopen('php://stdin','r');

echofgets($fh);

fclose($fh);

?>

[rainbird@rainbird-desktop ~]$echo"aaaaa"|./a.php

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

[rainbird@rainbird-desktop ~]$tail /etc/passwd|./a.php

couchdb:x:106:113:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash

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

[rainbird@rainbird-desktop ~]$cat a.php

#!/usr/bin/php -q

echo file_get_contents('php://stdin');

?>

[rainbird@rainbird-desktop ~]$tail /etc/passwd|./a.php

couchdb:x:106:113:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash

haldaemon:x:107:114:Hardware abstraction layer,,,:/var/run/hald:/bin/false

speech-dispatcher:x:108:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/sh

kernoops:x:109:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false

saned:x:110:116::/home/saned:/bin/false

pulse:x:111:117:PulseAudio daemon,,,:/var/run/pulse:/bin/false

gdm:x:112:119:Gnome Display Manager:/var/lib/gdm:/bin/false

rainbird:x:1000:1000:rainbird,,,:/home/rainbird:/bin/bash

sshd:x:113:65534::/var/run/sshd:/usr/sbin/nologin

postfix:x:114:122::/var/spool/postfix:/bin/false

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

[rainbird@rainbird-desktop ~]$./a.php

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/bin/sh

bin:x:2:2:bin:/bin:/bin/sh

sys:x:3:3:sys:/dev:/bin/sh

sync:x:4:65534:sync:/bin:/bin/sync

......

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

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

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

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

  2. Delphi通过管道执行外部命令行程序(cmd)并获取返回结果

    该代码片段来自于: http://www.sharejs.com/codes/delphi/8999,发现好多代码,想用的时候找不到,记录一下备用 function RunDosCommand(Com ...

  3. 再说linux命令行的管道

    linux管道 linux命令上的管道大家想必是经常用了 cat 1.txt | grep xxx; 这是常见的用法,说说管道,pipe是 liunx上常见的IPC方法,在 linux system ...

  4. linux中管道的概念,浅谈Linux管道

    管道(pipe)是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念.管道是UNIX环境中历史最悠久的进程间通信方式,从本质上说,管道也是一种文件,也是遵循UNIX的"一切皆文件 ...

  5. Linux基础 -- 命令执行顺序控制与管道

    2019独角兽企业重金招聘Python工程师标准>>> 1.命令执行顺序的控制 1.1.顺序执行多条命令 Linux中让命令顺序执行,可以使用;来完成.和Java中很像,分号用来分隔 ...

  6. RHEL6入门系列之十一,内/外部命令、重定向、管道

    前面一口气介绍了18个命令,可能大家都已经有些晕了.学习Linux就是这样,它不像Windows那样的傻瓜式操作,要想学好Linux是必须要下苦功的.所以,Linux本身就不是一个面向普通用户的桌面操 ...

  7. 机器学习管道模型_使用连续机器学习来运行您的ml管道

    机器学习管道模型 Vaithy NarayananVaithy Narayanan Follow跟随 Jul 15 7月15 使用连续机器学习来运行ML管道 (Using Continuous Mac ...

  8. Linux下命令执行顺序控制与管道

    一.命令执行顺序的控制 顺序执行多条命令 通常情况下,每次只能在终端输入一条命令,执行完成后,再输入第二条命令,然后再按回车执行.要想一次性输入完执行,可以使用简单的顺序执行";" ...

  9. 《Linux命令行大全》:1-6:重定向和管道(很精彩)

    <Linux命令行大全>:1-6:重定向和管道(很精彩) https://www.toutiao.com/i6937081007581430303/?tt_from=weixin& ...

最新文章

  1. 美国再出半导体新法案!1800亿谋求芯片制造振兴
  2. php中this,self,parent三个关键字之间的区别(转载)
  3. 【java实训课】工程项目文件(IDEA+MYSQL)
  4. Apache Hive JdbcStorageHandler 编程入门指南
  5. 使用report 打印category 03的IBASE hierarchy
  6. CV_MAT_ELEM——获取矩阵元素和初始化矩阵
  7. cmw500综合测试仪使用_网络性能测试仪该怎么选
  8. Maven的下载、安装和配置
  9. java多线程_Java多线程
  10. OTSU大津法对图像二值化
  11. Android短信页面
  12. 牛顿插值法 matlab程序计算方法,牛顿插值法matlab程序
  13. MATLAB常见非线性可视化绘制方法-分岔图与庞加莱截面(混沌可视化、Poincare截面、Logistic、Henon、Lorenz、Rossler、Duffing系统)
  14. AT91SAM9260EK总是出现有RomBOOT提示但是却无法连接SAM-BA的方法
  15. 芯片烧录器编程AT24C02
  16. 如何取消计算机限制连接,怎样解除网络连接限制?
  17. java.lang.NumberFormatException: null的解决方法
  18. 启动Nginx时报错:error while loading shared libraries: librdkafka.so.1: cannot open shared object file: No
  19. [转载]雅礼中学2012届高三年级第三次阶段考试试卷
  20. 强烈推荐 :最用心的运营数据指标解读

热门文章

  1. Nginx 作为 WebSockets 代理
  2. ReactNative 告别CodePush,自建热更新版本升级环境
  3. BZOJ 1001 狼捉兔子
  4. 让窗体接受拖放, 并获取拖过来的文件信息 - 回复 海浪问 的问题
  5. 在辞职后的旅途中:我写了个App 创立了一家公司
  6. UDT中select异常
  7. git log 你学废了吗?
  8. 每日一题(20)——malloc与free(一)
  9. uniapp封装网络请求_八张图带你走进“通过一个完美请求封装一个网络模块”
  10. 数据结构之图:用图解决案例,Python代码实现——24