Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26187613
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类:

2010-03-29 21:14:01

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

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


[rainbird@rainbird-desktop ~]$cat a.php  
#!/usr/bin/php -q  
$fh = fopen('php://stdin','r');  
echo fgets($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做程序 的同学们再遇到这样的需求知道怎么处理了吧:)这个小经历再次印证:程序是算法的表达方式,算法是灵魂,有思路才有出路.


PS:今天遇到JAVA里面调用系统命令的时候如ps aux|grep mysql的时候居然没反应不出来结果。我想能否通过这种办法来解决呢?将ps aux做为程序的输入参数丢给这个JAVA程序让它接受到参数值然后将这个参数值再做处理?


阅读(960) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~