从perl / php脚本执行终端命令是一个好习惯吗?

时间:2016-05-11 16:48:21

标签: php bash perl sh

使用反引号或exec()system()执行命令。

4 个答案:

答案 0 :(得分:4)

是的,几乎在所有情况下这都是糟糕的做法!如果你有选择的话,尤其如此。

执行外部命令是:

  • 非常难以正确(但很容易获得工作)。您无法逃脱shell args并将其称为一天,您必须考虑潜在的不同语言的多个级别的转义。

  • <强>慢即可。 fork + exec例如rm比相应的系统调用慢一千倍。

  • 严格,容易出错且无法解释的集成点。您通常必须将数据转换为平面字符串列表并返回。您无法使用语言的功能,如异常处理,嵌套数据结构或回调。

由于这个原因,以下是不良原因来调用外部命令:

  • 不知道如何用您的语言执行X,但知道shell命令。一个典型的例子是cp -R foo bar

  • 不知道某些东西是如何工作的,但知道shell oneliner就是这样做的。一个典型的例子是foo *.mp4 > >(tee file)

  • 不想学习新的API,例如json或http,而是使用jqcurl等shell工具。

但是,如果您正在调用一个执行非平凡事情的程序,那么它没有本机库或绑定,并且您知道如何使用execve语义调用(NOT {{1并且perl system语义调用shell),这是一个有价值的工具。

执行上述所有外部命令的良好用法示例是调用exec从安装程序构建项目,或运行make以启动Minecraft服务器。

答案 1 :(得分:2)

某些操作系统命令可能具有语言不可用的内置功能(perl的mkdir()缺少* ix mkdir的-p)。然后,使用语言结构而不是解析输出(readdir()vs ls)可能更容易做到。

重要的是要记住,用perl编写的东西可能比调用特定于os的外部程序更容易移植到非unix系统。

答案 2 :(得分:2)

这是一个很棒的 * 练习。 Perl和PHP非常适合很多东西,但是它们并不是很好用,并且在项目中使用外部程序和其他工具有一个用例。但Perl绝对擅长的一件事就是将输入和输出格式粘合在一起,让你将几个不同的工具混合到一个项目中,让项目的每个部分都做到最好。

* 我的意思是,通常是一种很好的做法。像@files=qx(ls $dir)@txt=qx(cat $textfile)这样的事情让所有正确思考的Perl程序员都感到畏缩。

答案 3 :(得分:0)

为什么不呢?

但是,要小心并转义命令中插入的所有字符串: