system

(PHP 4, PHP 5, PHP 7)

system执行外部程序,并且显示输出

说明

system ( string $command [, int &$return_var ] ) : string

同 C 版本的 system() 函数一样, 本函数执行 command 参数所指定的命令, 并且输出执行结果。

如果 PHP 运行在服务器模块中, system() 函数还会尝试在每行输出完毕之后, 自动刷新 web 服务器的输出缓存。

如果要获取一个命令未经任何处理的 原始输出, 请使用 passthru() 函数。

参数

command

要执行的命令。

return_var

如果提供 return_var 参数, 则外部命令执行后的返回状态将会被设置到此变量中。

返回值

成功则返回命令输出的最后一行, 失败则返回 FALSE

范例

Example #1 system() 例程

<?php
echo '<pre>';

// 输出 shell 命令 "ls" 的返回结果
// 并且将输出的最后一样内容返回到 $last_line。
// 将命令的返回值保存到 $retval。
$last_line system('ls'$retval);

// 打印更多信息
echo '
</pre>
<hr />Last line of the output: ' 
$last_line '
<hr />Return value: ' 
$retval;
?>

注释

Warning

当用户提供的数据传入此函数,使用 escapeshellarg()escapeshellcmd() 来确保用户欺骗系统从而执行任意命令。

Note:

如何程序使用此函数启动,为了能保持在后台运行,此程序必须将输出重定向到文件或其它输出流。否则会导致 PHP 挂起,直至程序执行结束。

Note: 安全模式 启用时,可仅可用 safe_mode_exec_dir 执行文件。实际上,现在不允许在到可执行的路径中存在 .. 组件。

Warning

安全模式 启用时,命令字符串会被 escapeshellcmd() 转换。因此,echo y | echo x 会变成 echo y \| echo x

参见

User Contributed Notes

Anonoymous 11-Apr-2019 11:06
Windows commands requiring a GUI.

Alot of the info on this topic is from the 2010-2012 time frame and referring to XP, and basically don't work.  I am using apache/php/mysql in windows 7.

When requiring a system command in windows with a GUI - such as a labview executable, notepad, etc..., others have mentioned the psexec command from sysinternals, since cmd /c wont work, but the specific use was not real clearly defined.  Here is what worked for me on windows 7: 

system('C:/nttools/2019/psexec \\\\10.100.100.101 -i  -u administrator -p password -accepteula -nobanner C:\\htdocs\\test\\test.bat');

The path to the psexec executable is with forward slashes, the remote PC network location (which was actually the local PC, not remote) was \\ip_address with an extra backslash for each backslash so that required the 4 \'s.

The path for the command to be executed by psexec required backslashes, which also requires double backslashes.

The -i option is for an interactive program, and is required for it to properly run, otherwise it show up in the taskmanager but not be visable or execute properly if given command line arguments.

The -accepteula -nobanner is to suppress the sysinternals message box about their license.

My command to execute is really long with multiple command line inputs with many surrounded in double quotes, so I thought it would be easiest to put that in a batch file and just call the bat file.  Works great, remote users loading the webpage causes the executable to pop up on the web server, do its analysis and disappear.  Labview can read native excel files with active-x functions and write to a mysql data base to store results etc, so thats a pretty powerful combination of functions.
jbeauwalker at gmail dot com 21-Jul-2018 07:58
no at mail dot com posted a bizarre (to me) fix for Windows users 6 years ago, suggesting adding the characters " 2>&1" to send the output to a file. Well, darn if it doesn't still work 6 years, several versions of Windows, and of PHP, later (and nothing else seems to work). If this isn't black magic I don't know what is!
Alastair Irvine 11-Dec-2017 02:10
Note that system() returns FALSE on failure, but this does NOT happen when the command returned a non-zero exit code.  system() won't even fail if the command isn't found.  (bash returns exit code 127 in this case.)  I assume system() only returns FALSE when something seriously bad happens, like not being able to run your shell.
no at mail dot com 19-May-2012 10:06
This is for WINDOWS users. I am running apache and I have been trying for hours now to capture the output of a command.

I'd tried everything that is written here and then continued searching online with no luck at all. The output of the command was never captured. All I got was an empty array.

Finally, I found a comment in a blog by a certain amazing guy that solved my problems.

Adding the string ' 2>&1' to the command name finally returned the output!! This works in exec() as well as system() in PHP since it uses stream redirection to redirect the output to the correct place!

system("yourCommandName 2>&1",$output) ;
daveloop 11-Feb-2011 07:32
I was trying to get the server-side to beep in windows 7.  I finally found something that would work without creating my own EXE.

Create a batch file with at the CMD prompt type:
 
   echo @echo (Alt-7)>beep.bat

Then execute it in PHP with:

   exec ('start /MIN c:\your_path_here\beep.bat');

NOTE: The only drawback I can find is that a cmd.exe does visually flash on the system (which is why I used the /MIN to ensure it only goes to the taskbar).  Not really sure why I don't like that, but it was a side effect that I wasn't looking for.
kexianin at diyism dot com 02-Dec-2009 11:41
If you can't see any output or error from system(), shell_exec() etc, you could try this:

<?php
function my_exec($cmd, $input='')
         {
$proc=proc_open($cmd, array(0=>array('pipe', 'r'), 1=>array('pipe', 'w'), 2=>array('pipe', 'w')), $pipes);
         
fwrite($pipes[0], $input);fclose($pipes[0]);
         
$stdout=stream_get_contents($pipes[1]);fclose($pipes[1]);
         
$stderr=stream_get_contents($pipes[2]);fclose($pipes[2]);
         
$rtn=proc_close($proc);
          return array(
'stdout'=>$stdout,
                      
'stderr'=>$stderr,
                      
'return'=>$rtn
                     
);
         }
var_export(my_exec('echo -e $(</dev/stdin) | wc -l', 'h\\nel\\nlo'));
?>

For example, "echo shell_exec('ls');" will get nothing output,
"my_exec('ls');" will get "sh: ls: command not found",
"my_exec('/bin/ls');" will maybe get "sh: /bin/ls: Permission denied",
and the permission may be caused by selinux.
grytolle at gmail dot com 03-May-2009 10:12
This is a work-around that makes the program run in it's own directory instead of the script's.

example usage:
<?php runAsynchronously("c:\games\jazz2\jazz2.exe","-connect 1.2.3.4"); ?>

<?php
function runAsynchronously($path,$arguments) {
   
$WshShell = new COM("WScript.Shell");
   
$oShellLink = $WshShell->CreateShortcut("temp.lnk");
   
$oShellLink->TargetPath = $path;
   
$oShellLink->Arguments = $arguments;
   
$oShellLink->WorkingDirectory = dirname($path);
   
$oShellLink->WindowStyle = 1;
   
$oShellLink->Save();
   
$oExec = $WshShell->Run("temp.lnk", 7, false);
    unset(
$WshShell,$oShellLink,$oExec);
   
unlink("temp.lnk");
}
?>
dukeman at seagate dot com 06-Aug-2008 01:02
For novices remember that the executable has to be in a directory the server is serving or only local host will be able to access it.
al at aj8 dot org 19-Jun-2008 04:54
In response to willytk at gmail dot com, 10-Sep-2007 01:39

If imagemagick / convert from eps or pdf is not working because the gs executable is not in the apache path, you can compile imagemagick with  --with-frozenpaths

This makes imagemagick store the full path to the gs executable. The error I was getting before was
"sh: gs: command not found"
when convert was called with "-debug All"

Cheers
Alastair Battrick
Daniel Morris (danielxmorris.com) 02-Jun-2008 06:34
How to produce a system beep with PHP.

<?php
       
function beep ($int_beeps = 1) {
            for (
$i = 0; $i < $int_beeps; $i++): $string_beeps .= "\x07"; endfor;
            isset (
$_SERVER['SERVER_PROTOCOL']) ? false : print $string_beeps;
        }

?>

This will not do anything when running through a browser, if running through a shell it will produce an audible beep $int_beeps times.  This should work on Windows, Unix, etc.
vlad dot sharanhovich at gmail dot com 09-Apr-2008 12:33
The double quote problem on Windows platform discussed earlier here in comments still present in PHP 5.2.5. You can't execute system($command) if $command contains more than 2 " chars. system('"echo" A'); works, while system('"echo" "A"'); does not. Search comment, that was a solution posted to overhaul this issue via temporary .bat file.
Dennis 21-Jan-2008 07:37
If you are writing CLI scripts in PHP and call external programs which produce some kind of progress bar you should really use passthru()  for the output of the external program to go to the terminal immediately.
Such progress bar are usually done by outputing the string with "\r" at the end, and contain no "\n". system() and friends look for "\n" before flushing the buffer. As a result, you see nothing during the lengthy operation and suddenly you get the 100% reading, because all output was buffered and quickly replayed into the terminal when the final "\n" has been seen.
willytk at gmail dot com 10-Sep-2007 05:39
If you're having problems with getting imagemagick/convert to work with ghostscript because the gs executable isn't in the apache PATH, do the following:

To create a thumb of the first pdf page:

<?php
$command
= 'export PATH=$PATH:/sw/bin; convert "files/example.pdf[0]" -thumbnail 150x150 "files/thumbs/example.png"';

$lastline = system($command,$return);
?>

Thanks entropy.ch and phpaladin!

Regards,

Willy T. Koch
Oslo, Norway
timgolding_10 at hotmail dot com 20-Jul-2007 07:19
An example of using the system to call the file command on a linux server. This script detects whether a user posted file is a jpeg, gif or png

<?PHP

$accepted_types
=array("JPEG" , "GIF", "PNG");

   
// The temporary filename of the file in which the uploaded file was stored on the server.
if(!empty($_FILES["uploadedfile"]))
  {
   
$uploaddir = $_SERVER['DOCUMENT_ROOT']."/images/";
   
$uploaddir.=basename( $_FILES['uploadedfile']['name']);
  
 
//verfiy file using linux FILE command
 
$last_line = system('file '.escapeshellarg($_FILES['uploadedfile']['tmp_name']), $retval);

 
//get the file extension returned through magic database
 
$splitvals=explode(' image data' $last_line);
 
$vals=explode(':', $splitvals[0]);
 
$vals[1]=str_replace(' ','', $vals[1]);

 if (
in_array($vals[1], $accepted_types))
 {
    echo
$vals[1].' was accepted <br />';
        if(!
file_exists($uploaddir)){
           
//Copy the file to some permanent location
           
if(move_uploaded_file($_FILES["uploadedfile"]["tmp_name"], $uploaddir))
             {
              echo
$uploaddir." was uploaded! <br />";
             }
            else
             {
              echo
"There was a problem when uploding the new file, please contact admin about this.";
             }
        }
        else echo
'This file already exists in DB please rename file before uploading';
}
}else echo
$_FILES['uploadedfile']['error'].'<br />';
?>
jordan314 at mailinator dot com 20-Mar-2007 12:44
z1a7n8g, your system logging to file function was really useful, but had two errors:
$line=fgets($fPtr,filesize("yourfile.php");
that line needs a second closing ')'
and:
while ($line)
returns true until your script runs out of memory. Those two lines can be combined:
while($line=fgets($fPtr,filesize("yourfile.php")));
dan at thecsl dot org 29-May-2006 08:45
You probably want to check your system calls for errors. The convention is to return 0  for "no error" which is the same as FALSE which can be confusing. You need to do something like:

<?php
  $cmd
= "/usr/bin/pngtopnm $png_file > $pnm_file";
 
system($cmd,$return_value);
  (
$return_value == 0) or die("returned an error: $cmd");
?>
matt-php at cdsportland dot com 17-Jan-2006 09:15
If using Windows with IIS and you're having problems with the system() and related commands, I found the easiest way to solve it was to modify the Authentication Method for the file (or directory) that uses the call and change the anonymous access user from the default (IUSR_IMAGE) to a user with enough permissions to execute the commands in the system call.  This way, there is no need to give execute permissions to IUSR_IMAGE on cmd.exe (which opens up a security risk system-wide) or copy cmd.exe into your php directory (per the suggestions of others).  Hope this helps someone!
cho at stunt growth dot com 03-Nov-2005 01:20
Note to the persons who suggested using backticks for gathering a return value from scripts via system().

Using Backticks is generally frowned upon for security sake.  They can be exploited more easily.

Instead, why not use the exec() function with a return parameter specified as an array type.  This will allow you to take the full string returned from your script (for example rsync) and return each line in an array.

like so:
$result = array();
exec( $cmd, &$result);
foreach ( $result as $v )
{
// parse, or do cool stuff
}

Hope this alternative brings you merriment.
vdweij at hotmail dot com 09-Aug-2005 02:41
It is possible to only capture the error stream (STERR). Here it goes...

(some_command par1 par2 > /dev/null) 3>&1 1>&2 2>&3

-First STDOUT is redirected to /dev/null.
-By using parenthesis it is possible to gain control over STERR and STOUT again.
-Then switch STERR with STOUT.

The switch is using the standard variable switch method -- 3 variables (buckets) are required to swap 2 variables with each other. (you have 2 variables and you need to switch the contents - you must bring in a 3rd temporary variable to hold the contents of one value so you can properly swap them).

This link gave me this information:
http://www.cpqlinux.com/redirect.html
Stuart Prescott 11-May-2005 10:14
Note that for stderr redirection, you have to use double quotes (") not single quotes (') for the 2>&1 part at least.

<?
//e.g. the this will NOT do what you expect:
exec('mysqldump -h localhost ...... 2>&1', $output);

//but this will:
exec("mysqldump -h localhost ...... 2>&1", $output);
?>

*sigh*

(Sounds like a PHP bug to me..., or at least buggy docs!)
phil at pjhayward.net 26-Apr-2005 01:37
On Windows XP, (possibly others)

If you are getting the unable to fork error, make sure the internet guest user has permission to read and execute the \Windows\System32\cmd.exe file.
srawlinNOSPAM at magma dot ca 04-Sep-2004 01:29
If you are running PHP in a chroot environment then the system (and passthru) function needs /bin/sh to be located in the chroot as well.
eric_REMOVE at movementmovement_REMOVE dot com 21-May-2004 12:56
It's important to note that if you are running a series of system() commands in a loop, you need to include the second argument in order for them to run synchonously.

ie)

// this will execute process.php asynchronously; not waiting for completion before executing the next one.
$array = array('apple', 'banana', 'pear');
foreach($array as $i)
{
system("php process.php \"fruit=$i\"");
}

// this will execute process.php 3 times, waiting for the prior command to complete before starting a new one
$array = array('apple', 'banana', 'pear');
foreach($array as $i)
{
system("php process.php \"fruit=$i\"", $status);
}
beetung at yahoo dot com 08-Mar-2004 01:34
Under Linux
exec() doesnt follow symbolic link when interpret by httpd...

I have my /home/www/cgi-bin --> soft linked to a samba mounted directory under /mnt/Downloads/www.site.com/cgi-bin

exec("/home/www/cgi-bin/runProg $a $b");

works ok when I execute the script using > php myscript.php but fails to show the output when run via the web browser.

When I give it the exact full path without the symbolic link

exec("/mnt/Downloads/www.site.com/cgi-bin/runProg $a $b");

everything works perfectly.
mortoray at ecircle-ag dot com 04-Mar-2004 03:55
Do not use "system" if you use the "php.ini" option:
    zlib.output_compression = On

Doing so will result in the browser receiving garbage (I'm guessing the headers/buffers get confused).

Use passthru in this case, it appears to work as intended.
tr4nc3 at msn dot com 22-Feb-2004 02:42
I almost gave up trying to get Windows XP w/ Apache 2 to use either system(), or exec() to run a batch file.

If the batch file was this...

echo test > test.txt

it would work fine, creating test.txt...

but if the batch file was..

iexplore.exe "http://www.ibm.com"

I would get nothing. After hours and hours of messing around with this I figured it must be some type of permission problem. (dugh!)

Long story a little shorter.. You have to give Apache permission to "interact with the desktop".

Here's how...

Start>Run>services.msc
Right click "Apache...", select properties.
Click on the "LOG ON" tab
Check the box "Allow this service to interact with desktop"
Click OK
Restart Apache

Works great!
:D

HOPE THIS HELPS SOMEONE!
Too bad I didn't find a post like this before I figured it out myself. (I could have been working on something.)
djem at shadrinsk dot net 17-Feb-2004 05:04
BUGFIX for the mysystem() function, posted by n-jones.

<?php
function syscall($command){
    if (
$proc = popen("($command)2>&1","r")){
        while (!
feof($proc)) $result .= fgets($proc, 1000);
       
pclose($proc);
        return
$result;
        }
    }
?>

Hello from Russia! :)
djem.
diogaogv at icqmail dot com 28-Nov-2003 04:57
a really useful use for import(); while running the server at ur own machine is taking a screenshot of you desktop and showing it to the guest !!!

<?
echo system("/usr/X11R6/bin/import -window root -display localhost:0 /mnt/d/Desenvolvimento/Desenvolvimento\ WWW/import/cache/imagem.jpg -quality 30" ." 2>&1");
?>
<img src="cache/imagem.jpg">

remember to set chmod 777 to your directory (called "cache" on my code). also do "xhost +" or you r gonna get a xlib error saying that it could not connect to x server at localhost...

the code is still too simple. i've just done it. e.g. you can improve a real cache system avoying more than one screenshot in a minute while...

that is it! hope u enjoy it ( rofl... =DDD ) ...

diogo86
tomlubbock at hotmail dot com 02-Nov-2003 06:07
If you need to run root-level commands, such as to reboot a service, the utility 'sudo' will let you handle linux permissions. In our example we use 'sudo' to allow apache temporary root access to restart a service. We can then use:

system("sudo service dhcpd restart")

You also need to examine the /etc/sudoers file to specify what permissions to grant. Hope this helps someone!
morris_hirsch at hotmail dot com 16-Sep-2003 02:49
another reason to use shell_exec instead of system is when the result is multiple lines such as grep or ls

<?php

// this correctly sets answer string to all lines found
//$answer = shell_exec ("grep 'set of color names' *.php ");
//echo "answer = $answer";

// this passes all lines to output (they  show on page)
// and sets answer string to the final line
 
$sys = system ("grep 'set of color names' *.php ");
 echo
"sys =(($sys))";

?>

here is view/source resulting from system call

setprefs.php:// The standard set of color names is:
setprefs.php:// Most browsers accept a wider set of color names
silly.php:  //$answer = shell_exec ("grep 'set of color names' *.php ");
silly.php: $sys = system ("grep 'set of color names' *.php ");
sys =((silly.php: $sys = system ("grep 'set of color names' *.php ");))

and here is view source from using shell_exec instead

answer = setprefs.php:// The standard set of color names is:
setprefs.php:// Most browsers accept a wider set of color names
silly.php:  $answer = shell_exec ("grep 'set of color names' *.php ");
silly.php:// $sys = system ("grep 'set of color names' *.php ");
lc at _REMOVE__THIS_lc dot yi dot org 09-Sep-2003 05:24
Re: cpmorris at hotmail dot com and WINNT.

I just spent some time learning to use the php system function.  I managed to get long file names to work for me.  It seems you need to take the same approach that batch files, WSH, and most other programming languages do under WinNT/2K/XP.  Putting double quotes around the Path+Filename seems to work.  So, something like this should have worked for you:

"c:\program files\apache group\apache2\bin\htpasswd"

Note that if you have parameters, they go OUTSIDE of the last quote.  Oh, and don't forget to escape the slashes and quotes! 

I don't know what htpasswd's params are, but let us pretend:

$cmd="\"c:\\program files\\apache group\\apache2\\bin\\htpasswd\" username password";
$str=system($cmd);

Hope this helps someone!

Leonard
http:\\www.lc.yi.org
Jim Belton 26-Aug-2003 01:58
To run a full screen program from a PHP CLI script, redirect input from and output to /dev/tty.  For example:

system("timeconfig > /dev/tty < /dev/tty");

System will wait for the program to finish before continuing.
chris at karakas-online dot de 01-Jul-2003 06:52
If your PHP installation permits execution of commands through system() (e.g. you are not running in safe mode, or, if you are, safe_mode_exec_dir contains all the commands you need), you can trigger a backup of your MySQL database, just by pointing your browser to the following script:

<?php
 
// Enter your MySQL access data 
 
$host= 'dbhost';        
 
$user= 'dbuser';              
 
$pass= 'dbpassword';
 
$db=   'db';

 
$backupdir = 'backups';  

 
// Compute day, month, year, hour and min.
 
$today = getdate();
 
$day = $today[mday];
  if (
$day < 10) {
     
$day = "0$day";
  }
 
$month = $today[mon];
  if (
$month < 10) {
     
$month = "0$month";
  }
 
$year = $today[year];
 
$hour = $today[hours];
 
$min = $today[minutes];
 
$sec = "00";

 
// Execute mysqldump command.
  // It will produce a file named $db-$year$month$day-$hour$min.gz
  // under $DOCUMENT_ROOT/$backupdir
 
system(sprintf(
   
'mysqldump --opt -h %s -u %s -p%s %s | gzip > %s/%s/%s-%s%s%s-%s%s.gz',                                                 
   
$host,
   
$user,
   
$pass,
   
$db,
   
getenv('DOCUMENT_ROOT'),
   
$backupdir,
   
$db,
   
$year,
   
$month,
   
$day,
   
$hour,
   
$min
 
)); 
  echo
'+DONE'
?>

If you are not allowed cron access on the web server, you can set up your own cron job to periodically call the above script. If you don't have cron, or a similar functionality on your system, you can still modify the above script to inform the browser to reget the file every xxx hours. A poor man's cron, so to say ;-)

Of course, the $backupdir should at least be protected with a .htaccess file.

And of course, you are not going to backup a really large database this way, if your PHP has some timeout set (as is usually the case with web hosters).
d dot kraft at szo dot de 10-Mar-2003 02:18
For PHP running inside a Webserver:

When calling a process via
system("your_process &");
to make it running in background, note that this process is killed when the webserver is restarted.
cnoelker at softpearls dot de 05-Mar-2003 06:13
Hi,
some tips for using a system()-call for batch files on a windows computer:
* Write the path to the executable with double back-slashes, like so:
   C:\\path\\to\\prog.exe
* If you are refering to other pathes, e.g. as a parameter, one back-slash works fine.
* Do not use SET for declaring parameters - this does not work! Example:
   SET PATH="C:\path\to\lib"
   echo path is %PATH%
This works fine when started from the comand line, but when called from PHP, the variable is just empty.
user at unknown dot com 15-Jan-2003 02:07
a simple way to include a beep on the server-side whenever a page in viewed.
**contents of 'beeping' page**
require ("beep.php")

**contents of beep.php**
<?php
system
("/home/site/exe/beep.executable");
// on windows system ("c:\beep.exe");
?>
n-jones at fredesign dot net 04-Aug-2002 03:08
To have system output from both the STDERR and STDOUT, I've modified the function posted above by lowery@craiglowery.com

function mysystem($command) {
  if (!($p=popen("($command)2>&1","r"))) {
    return 126;
  }

  while (!feof($p)) {
    $line=fgets($p,1000);
    $out .= $line;
  }
  pclose($p);
  return $out;
}

Now you can use mysystem() like;

$var = "cat ".$file;
echo mysystem($var);

$catfile = mysystem($var);

if (ereg("text", $catfile)) {
  //stuff here;
}

N.Jones
roger at proproject dot com 12-May-2002 10:35
For your in-house pages, I recommend redirecting stderr to stdout so you'll know if something goes wrong.  Here's a real-life example:

system("/mysql_reboot 2>&1");
james at jsrobertson dot net 26-Mar-2002 11:48
I've found a very useful technique for the system function. Say if you want to create a page of quotes and you have /usr/games/fortune available. Instead of spending time creating a database and populating it with thousands of quotes, you can just use:

<?php
system
('/usr/games/fortune');
?>

likewise if you want to list the files in your directory, say for example, Mp3's?

<?php
system
('ls /home/mp3 -l');
?>

basically

<?php
system
('any_command');
?>
tk at taponet dot de 20-Feb-2002 07:17
Beware:
if (! system($cmd)) {
  print "error";
}

does not work!
Use
if (system($cmd) === false) {
...}

instead!
ryan at seattleone dot com 29-Aug-2001 05:36
I was trying to use the system command, and I couldnt get it to work, then it occured to me, send the stderr to a file to see what is really happening.

system( $command . " &> /tmp/error " );
nospam at php dot net 24-Jul-2000 05:57
If you are trying to parse a CGI script to your webserver which needs arguments, take a look to the virtual() function .. it took me long before i found out it existed...
It's used like this:
<?php
virtual
("/cgi-bin/lastuser.cgi?argument");
?>
And that works excellent now for me
ccurtis at aet-usa dot com 14-Jun-1999 11:07
If no headers have been printed, calling the system() function will flush the headers to the client and insert a newline; no further headers or cookies will be transferred to the browser.  In version 3.0.7, you will not be warned that the Header() function failed, but will be warned if trying to set a cookie.  If you want to continue to send headers after the function call, use exec() instead.