我在代码中已经多次看到这样的事情,这似乎是在调用像MySQL这样的程序时跨平台的努力:
if ( $mysql = exec( 'which mysql' ) ) {
// Use the path returned from 'which'.
exec( "$mysql {{{SOME MYSQL CMD HERE}}}" );
} else {
// The call failed, so try and guess MySQL path.
exec( "mysql {{{SOME MYSQL CMD HERE}}}" );
}
然而,这不是没有意义的吗?如果哪个能够猜出正在使用哪个mysql路径,那么已经提供了路径并且“' else'本来会有用的。如果它不存在,则两种选择都不起作用。
我感到好奇的是,是否曾经有过这样的情况:直接通过exec调用命令行实用程序如mysql或git不会起作用,但是试图首先猜测路径到哪个或哪里?
答案 0 :(得分:3)
你正在尝试的是毫无意义的。 which
正在迭代$PATH
环境变量的元素,并尝试在那里找到名为mysql
的二进制文件。
如果您只是发布mysql
(没有路径),那么shell将与which
执行相同的操作,但随后会执行命令。
您必须知道的一件重要事情:与glibc
函数不同,PHP的exec()
执行shell中的$command
- 不是直接!您可以使用没有路径的二进制名称,因为它在shell中执行,shell尝试在$PATH
中查找二进制文件。
答案 1 :(得分:0)
只有在您的系统上没有which
时才会触及其他情况。
无论如何这是不好的做法:
如果在搜索路径中找到了which
但没有找到mysql
,则exec
无论如何都会成功执行which-command,因此第一个条件为真。但在这种情况下,$ mysql-var包含一个字符串,其中包含" YOUR_PATH_HERE"中没有mysql。如果自己执行,这当然会导致错误。