您的位置:首页 > 运维架构 > Shell

在perl中嵌入shell命令

2010-06-22 17:56 141 查看
在linux中,如果要把几个可执行程序结合起来使用,一般是采用shell或者perl,当然,python也可以。

这里说一下在perl里嵌入shell命令的情形。

一般来说,最简单的方式就是采用“(qx//)就可以执行命令

1
2

$cmd = "du * sh";
`$cmd`;

这样命令就执行了,但是却并没有输出。要输入的话,简单的可以这么处理:

1

print `$cmd`;

这里,如果程序有输入,那就不行了,后面再细说。

 

下面看看另外一种方式,即system执行命令,它可以返回程序的退出状态,也就是说它可以判断程序执行是否成功,我们也可以拿它来做个有趣的东西,看下面的程序:

1
23
4
5
6
7
8

#include <iostream>
using namespace std;
int main(int argt, char* argv[]){
int a = (int)argv[1][0]-48;
int b = (int)argv[2][0]-48;
cout << a+b << endl;
return a+b;
}

这是一个c++程序,我们把程序的退出状态设定为输入参数的第1和第2个参数的第一个字符代表的数字的和。通过g++,我们把它编译为add程序: g++ add.cc -o add

那么利用perl的system函数,就可以捕获这一退出状态:

1
23
4

#!/usr/bin/perl
 
$a=1;$b=3;
print system("./add $a $b");

输出4

也就是说我们可以利用其他程序来为perl做计算,这个是不是有点像dll的味道? :)

但是这里有个缺点,就是程序的退出状态必须是整数。

那么perl是不是就没办法做这件事了呢? 我要说是,很多perl的fans肯定不乐意了,既然perl强大,我们就见识一下它怎么来做这件事吧

我们把那个c++程序改一改:

1
23
4
5
6

#include <iostream>
using namespace std;
int main(int argt, char* argv[]){
cout << (int)argv[1][0];
return 0;
}

我们用这个程序来输出第一个参数的第一个字符的ascii码,在perl里我们这么来使用:

1
23
4
5

#!/usr/bin/perl
 
$a = "a";
$b = `./add $a`;
print $a,":",$b,"n";

输出 a:97

怎么样,是不是更有dll的味道了?

最后来说一下如果调用的程序里有输入,又该怎么处理呢? 我们再把c++程序改一改

1
23
4
5
6
7
8
9

#include<iostream>
using namespace std;
int main(){  //这次直接采用输入流输入参数,不直接接受参数
char a;
cout << "input a char:" << endl;   //这里有endl非常重要,下面解释
cin >> a;
cout << (int)a << endl;
return 0;
}

这个程序让用户手动输入字符,打印字符的ascii码,来看在perl中的调用

1
23
4
5

#!/usr/bin/perl
 
$cmd = "./add";
open(CMD, "($cmd) |");
while(<CMD>){print;}  #一行一行地输出<br />close(CMD);<br /></cmd>

输出:

input a char:
a
97

解释一下为什么第一个endl很重要,因为在输出的时候,无法同时处理输入和输出,所以加换行,让输入单独在一行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息