\section{\module{commands} ---
         Utilities for running commands}

\declaremodule{standard}{commands}
  \platform{Unix}
\modulesynopsis{Utility functions for running external commands.}
\sectionauthor{Sue Williams}{sbw@provis.com}


The \module{commands} module contains wrapper functions for
\function{os.popen()} which take a system command as a string and
return any output generated by the command and, optionally, the exit
status.

The \module{commands} module defines the following functions:


\begin{funcdesc}{getstatusoutput}{cmd}
Execute the string \var{cmd} in a shell with \function{os.popen()} and
return a 2-tuple \code{(\var{status}, \var{output})}.  \var{cmd} is
actually run as \code{\{ \var{cmd} ; \} 2>\&1}, so that the returned
output will contain output or error messages. A trailing newline is
stripped from the output. The exit status for the command can be
interpreted according to the rules for the C function
\cfunction{wait()}.
\end{funcdesc}

\begin{funcdesc}{getoutput}{cmd}
Like \function{getstatusoutput()}, except the exit status is ignored
and the return value is a string containing the command's output.  
\end{funcdesc}

\begin{funcdesc}{getstatus}{file}
Return the output of \samp{ls -ld \var{file}} as a string.  This
function uses the \function{getoutput()} function, and properly
escapes backslashes and dollar signs in the argument.
\end{funcdesc}

Example:

\begin{verbatim}
>>> import commands
>>> commands.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> commands.getstatusoutput('cat /bin/junk')
(256, 'cat: /bin/junk: No such file or directory')
>>> commands.getstatusoutput('/bin/junk')
(256, 'sh: /bin/junk: not found')
>>> commands.getoutput('ls /bin/ls')
'/bin/ls'
>>> commands.getstatus('/bin/ls')
'-rwxr-xr-x  1 root        13352 Oct 14  1994 /bin/ls'
\end{verbatim}
