Execute a system command

Revision as of 06:14, 11 July 2009 by rosettacode>Dkf (→‎{{header|Python}}: formatting)

In this task, the goal is to run either the ls (dir on Windows) system command, or the pause system command.

Task
Execute a system command
You are encouraged to solve this task according to the task description, using any language you may know.

Ada

<lang ada>

with Interfaces.C; use Interfaces.C;

procedure Execute_System is
   function Sys (Arg : Char_Array) return Integer;
   pragma Import(C, Sys, "system");
   Ret_Val : Integer;
begin
   Ret_Val := Sys(To_C("ls"));
end Execute_System;

</lang>

ALGOL 68

Works with: ALGOL 68G version Any - tested with release mk15-0.8b.fc9 - "system" is not part of the standard's prelude.

<lang>system("ls")</lang>

Or the classic "!" shell escape can be implemented as an "!" operator:

Works with: ALGOL 68G version Any - tested with release mk15-0.8b.fc9 - "system" & "ANDF" are not part of the standard's prelude.

<lang>OP ! = (STRING cmd)BOOL: system(cmd) = 0;

IF ! "touch test.tmp" ANDF ( ! "ls test.tmp" ANDF ! "rm test.tmp" ) THEN

 print (("test.tmp now gone!", new line))

FI</lang>

AppleScript

do shell script "ls" without altering line endings

AutoHotkey

<lang autohotkey>Run, %comspec% /k dir & pause</lang>

AWK

<lang awk>BEGIN {

 system("ls")

}</lang>

C

Works with: POSIX version .1-2001

<lang c> #include <stdlib.h>

int main()
{
    system("ls");
}</lang>

C++

Works with: Visual C++ version 2005
system("pause");

C#

Using Windows / .NET: <lang csharp>using System.Diagnostics;

namespace Execute {

   class Program
   {
       static void Main(string[] args)
       {
           Process.Start("cmd.exe", "/c dir");
       }
   }

}</lang>

Works with: MCS version 1.2.3.1

<lang csharp>using System;

 class Execute {
    static void Main() {
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.EnableRaisingEvents=false;
        proc.StartInfo.FileName="ls";
        proc.Start();
   }
}</lang>

dc

! ls

E

def ls := makeCommand("ls")
ls("-l")
def [results, _, _] := ls.exec(["-l"])
when (results) -> {
  def [exitCode, out, err] := results
  print(out)
} catch problem {
  print(`failed to execute ls: $problem`)
}

Erlang

os:cmd("ls").

Forth

Works with: gforth version 0.6.2
s" ls" system

Fortran

Works with: gfortran

The SYSTEM subroutine (and function) are a GNU extension. <lang fortran>program SystemTest

 call system("ls")

end program SystemTest</lang>

gnuplot

<lang gnuplot>!ls</lang>

Haskell

Works with: GHCi version 6.6
import System.Cmd

main = system "ls" 

IDL

 $ls

Will execute "ls" with output to the screen.

 spawn,"ls",result

will execute it and store the result in the string array "result".

 spawn,"ls",unit=unit

will execute it asynchronously and direct any output from it into the LUN "unit" from whence it can be read at any (later) time.

Io

SystemCall with("ls") run

J

The system command interface in J is provided by the standard "task" script:

   load'task'
   
   NB.  Execute a command and wait for it to complete
   shell 'dir'
   
   NB.  Execute a command but don't wait for it to complete 
   fork 'notepad'
   
   NB.  Execute a command and capture its stdout
   stdout   =:  shell 'dir'  
   
   NB.  Execute a command, provide it with stdin, 
   NB.  and capture its stdout
   stdin    =:  'blahblahblah'
   stdout   =:  stdin spawn 'grep blah'
   

Java

Works with: Java version 1.5+

<lang java5>import java.util.Scanner; import java.io.*;

public class Program {

   public static void main(String[] args) {    	
   	try {
   		Process p = Runtime.getRuntime().exec("cmd /C dir");//Windows command, use "ls -oa" for UNIX
   		Scanner sc = new Scanner(p.getInputStream());    		
   		while (sc.hasNext()) System.out.println(sc.nextLine());
   	}
   	catch (IOException e) {
   		System.out.println(e.getMessage());
   	}
   }

}</lang>

Works with: Java version 1.4+

There are two ways to run system commands. The simple way, which will hang the JVM (I would be interested in some kind of reason). -- this happens because the the inputStream buffer fills up and blocks until it gets read. Moving your .waitFor after reading the InputStream would fix your issue (as long as your error stream doesn't fill up) <lang java>import java.io.IOException; import java.io.InputStream;

public class MainEntry {

   public static void main(String[] args) {
       executeCmd("ls -oa");
   }
   private static void executeCmd(String string) {
       InputStream pipedOut = null;
       try {
           Process aProcess = Runtime.getRuntime().exec(string);
           aProcess.waitFor();
           pipedOut = aProcess.getInputStream();
           byte buffer[] = new byte[2048];
           int read = pipedOut.read(buffer);
           // Replace following code with your intends processing tools
           while(read >= 0) {
               System.out.write(buffer, 0, read);
               
               read = pipedOut.read(buffer);
           }
       } catch (IOException e) {
           e.printStackTrace();
       } catch (InterruptedException ie) {
           ie.printStackTrace();
       } finally {
           if(pipedOut != null) {
               try {
                   pipedOut.close();
               } catch (IOException e) {
               }
           }
       }
   }
   
   

}</lang>

And the right way, which uses threading to read the InputStream given by the process. <lang java>import java.io.IOException; import java.io.InputStream;

public class MainEntry {

   public static void main(String[] args) {
       // the command to execute
       executeCmd("ls -oa");
   }
   private static void executeCmd(String string) {
       InputStream pipedOut = null;
       try {
           Process aProcess = Runtime.getRuntime().exec(string);
           // These two thread shall stop by themself when the process end
           Thread pipeThread = new Thread(new StreamGobber(aProcess.getInputStream()));
           Thread errorThread = new Thread(new StreamGobber(aProcess.getErrorStream()));
           
           pipeThread.start();
           errorThread.start();
           
           aProcess.waitFor();
       } catch (IOException e) {
           e.printStackTrace();
       } catch (InterruptedException ie) {
           ie.printStackTrace();
       }
   }

}

//Replace the following thread with your intends reader class StreamGobber implements Runnable {

   private InputStream Pipe;
   public StreamGobber(InputStream pipe) {
       if(pipe == null) {
           throw new NullPointerException("bad pipe");
       }
       Pipe = pipe;
   }
   public void run() {
       try {
           byte buffer[] = new byte[2048];
           int read = Pipe.read(buffer);
           while(read >= 0) {
               System.out.write(buffer, 0, read);
               read = Pipe.read(buffer);
           }
       } catch (IOException e) {
           e.printStackTrace();
       } finally {
           if(Pipe != null) {
               try {
                   Pipe.close();
               } catch (IOException e) {
               }
           }
       }
   }

}</lang>

Works with: UCB Logo

The lines of output of the SHELL command are returned as a list.

print first butfirst shell [ls -a]   ; ..

Lua

<lang lua>

-- just executing the command
os.execute("ls")
-- to execute and capture the output, use io.popen
local f = io.popen("ls") -- store the output in a "file"
print( f:read("*a") )    -- print out the "file"'s content

</lang>

MAXScript

dosCommand "pause"

Make

make can use system command in either definition of variables or in the targets

in definition

contents=$(shell cat foo)
curdir=`pwd`

in target

mytarget:
   cat foo | grep mytext

Modula-3

This code requires the UNSAFE keyword because M3toC deals with C strings (which are pointers), and are implemented in Modula-3 as UNTRACED, meaning they are not garbage collected, which is why the code calls FreeCopiedS().

Also note the EVAL keyword, which ignores the return value of a function. <lang modula3>UNSAFE MODULE Exec EXPORTS Main;

IMPORT Unix, M3toC;

VAR command := M3toC.CopyTtoS("ls");

BEGIN

 EVAL Unix.system(command);
 M3toC.FreeCopiedS(command);

END Exec.</lang>

Objective-C

Works with: GCC

NSTask runs an external process with explicit path and arguments. <lang objc> void runls()

{
    [[NSTask launchedTaskWithLaunchPath:@"/bin/ls"
        arguments:[NSArray array]] waitUntilExit];
}</lang>

If you need to run a system command, invoke the shell: <lang objc> void runSystemCommand(NSString *cmd)

{
    [[NSTask launchedTaskWithLaunchPath:@"/bin/sh"
        arguments:[NSArray arrayWithObjects:@"-c", cmd, nil]]
        waitUntilExit];
}</lang>

Complete usage example:


Works with: Cocoa
Works with: GNUstep

<lang objc>#import <Foundation/Foundation.h>

void runSystemCommand(NSString *cmd) {

   [[NSTask launchedTaskWithLaunchPath:@"/bin/sh"
       arguments:[NSArray arrayWithObjects:@"-c", cmd, nil]]
       waitUntilExit];

}

int main(int argc, const char **argv) {

  NSAutoreleasePool *pool;
  
  pool = [NSAutoreleasePool new];
  
  runSystemCommand(@"ls");
  [pool release];
  return 0;

}</lang>


Or use the C method above.

OCaml

Just run the command:

<lang ocaml>Sys.command "ls"</lang>

To capture the output of the command:

<lang ocaml>#load "unix.cma";; let syscall cmd =

 let inc, outc = Unix.open_process cmd in  
 let buf = Buffer.create 16 in                       
 (try
    while true do
      Buffer.add_channel buf inc 1
    done
  with End_of_file -> ());
 let _status = Unix.close_process (inc, outc) in
 Buffer.contents buf;;

let listing = syscall "ls";;</lang>

Octave

<lang octave>system("ls");</lang>

Perl

my @results = qx(ls);
# runs command and returns its STDOUT as a string
my @results = `ls`;
# ditto, alternative syntax

system "ls";
# runs command and returns its exit status; its STDOUT gets output to our STDOUT

print `ls`;
#The same, but with back quotes

exec "ls";
# replace current process with another

Also see: http://perldoc.perl.org/perlipc.html#Using-open()-for-IPC http://perldoc.perl.org/IPC/Open3.html

PHP

The first line execute the command and the second line display the output:

@exec($command,$output);
echo nl2br($output);

Note:The '@' is here to prevent error messages to be displayed, 'nl2br' translate '\n' chars to 'br' in HTML.

Pop11

The sysobey function runs commands using a shell:

 sysobey('ls');

Prolog

Works with: SWI Prolog
Works with: GNU Prolog

<lang prolog>shell('ls').</lang>

Python

Works with: Python version 2.5

<lang python>import os code = os.system('ls') # Just execute the command, return a success/fail code output = os.popen('ls').read() # If you want to get the output data. Deprecated.</lang>

or

Works with: Python version 2.4 (and above)

<lang python>from subprocess import PIPE, Popen, STDOUT p = Popen('ls', stdout=PIPE, stderr=STDOUT) print p.communicate()[0]</lang>

Note: The latter is the preferred method for calling external processes, although cumbersome, it gives you finer control over the process.

or

Works with: Python version 2.2 (and above)

<lang python>import commands stat, out = commands.getstatusoutput('ls') if not stat:

   print out</lang>

R

<lang R>system("ls")</lang>

Raven

Back tick string is auto executed:

`ls -la` as listing

Or specifically on any string:

'ls -la' shell as listing

Ruby

<lang ruby> string = `ls`

# runs command and returns its STDOUT as a string
string = %x{ls}
# ditto, alternative syntax

system "ls"
# runs command and returns its exit status; its STDOUT gets output to our STDOUT

print `ls`
#The same, but with back quotes

exec "ls"
# replace current process with another</lang>

Slate

Run a command normally through the shell:

<lang slate> Platform run: 'ls'. </lang>

Run a command (this way takes advantage of the 'does not understand' message for the shell object and calls the Platform run: command above with a specific command):

<lang slate> shell ls: '*.slate'. </lang>

Smalltalk

<lang smalltalk>Smalltalk system: 'ls'.</lang>

Standard ML

Just run the command:

<lang ocaml>OS.Process.system "ls"</lang>

Tcl

<lang tcl>puts [exec ls]</lang>

This page uses "ls" as the primary example. For what it's worth, Tcl has built-in primitives for retrieving lists of files so one would rarely ever directly exec an ls command.

It is also possible to execute a system command by "open"ing it through a pipe from whence any output of the command can be read at any (later) time. For example:

<lang tcl>set io [open "|ls" r]</lang>

would execute "ls" and pipe the result into the unit "io". From there one could receive it either line by line like this:

<lang tcl>set nextline [gets $io]</lang>

or read the whole shebang in a fell swoop:

<lang tcl>set lsoutput [read $io]</lang>

If the command is opened "rw", it is even possible to send it user input through the same handle, though care must be taken with buffering in that case.

Toka

 needs shell
 " ls" system

UNIX Shell

UNIX shells are designed to run system commands as a default operation.

ls

If one wants to capture the command's standard output:

CAPTUREDOUTPUT=$(ls)

In C-Shell this can be achieved by

set MYCMDOUTPUT = `ls`
echo $MYCMDOUTPUT 

Where as in Korn Shell it becomes:

 MYCMDOUTPUT=`ls`
 echo $MYCMDOUTPUT

Note: in these last cases, C-Shell and Korn Shell, these are "backticks" rather than quotes or apostrophes. These "backticks" can also be used in Bourne compatible shells, though the $(...) form is preferred when discussing such things in e-mail, on USENET, or in other online forums (such as this wiki). Also the $(...) form of command substitution is nestable.

If one wishes to replace the shell process with some other command (chain into some command with no return) one can use the exec shell built-in command in any of the common UNIX shells (C-Shell, and all of the Bourne-compatible shells).

exec ls

Ursala

The library function, ask, parameterized by a shell descriptor, such as bash, spawns a process that interacts with that shell by feeding it a list of commands, and returns a transcript of the interaction.

Note that the output from the spawned process is captured and returned only, not sent to the standard output stream of the parent.

Here is a self-contained command line application providing a limited replacement for the ls command. <lang Ursala>#import std

  1. import cli
  1. executable ('parameterized',)

myls = <.file$[contents: --<>]>@hm+ (ask bash)/0+ -[ls --color=no]-!</lang> The color option is needed to suppress terminal escape sequences.

Visual Basic

Shelling out a sub task in Visual Basic is rather a pain if you need to wait for the task to complete, which is probably the usual case. But it is possible. <lang vb>Attribute VB_Name = "mdlShellAndWait" Option Explicit

Private Declare Function OpenProcess Lib "kernel32" _

   (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
   ByVal dwProcessId As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" _

   (ByVal hProcess As Long, lpExitCode As Long) As Long

Private Const STATUS_PENDING = &H103& Private Const PROCESS_QUERY_INFORMATION = &H400

' ' Little function go get exit code given processId ' Function ProcessIsRunning( processId as Long ) as Boolean

   Dim exitCode as Long
   Call GetExitCodeProcess(lProcessId, exitCode)
   ProcessIsRunning = (exitCode = STATUS_PENDING)

End Function

' Spawn subprocess and wait for it to complete. ' I believe that the command in the command line must be an exe or a bat file. ' Maybe, however, it can reference any file the system knows how to "Open" ' ' commandLine is an executable. ' expectedDuration - is for poping up a dialog for whatever ' infoText - text for progressDialog dialog

Public Function ShellAndWait( commandLine As String, _

   expectedDuration As Integer ) As Boolean
   
   Dim inst As Long
   Dim startTime As Long
   Dim expirationTime As Long
   Dim pid As Long
   Dim expiresSameDay As Boolean
   
   On Error GoTo HandleError
   'Deal with timeout being reset at Midnight ($hitForBrains VB folks)
   startTime = CLng(Timer)
   expirationTime = startTime + expectedDuration
   expiresSameDay = expirationTime < 86400
   If Not expiresSameDay Then
       expirationTime = expirationTime - 86400
   End If
   inst = Shell(commandLine, vbMinimizedNoFocus)
   
   If inst <> 0 Then
       pid = OpenProcess(PROCESS_QUERY_INFORMATION, False, inst)
       Do While ProcessIsRunning( pid)
           DoEvents
           If Timer > expirationTime And (expiresSameDay Or Timer < startTime) Then
               Exit Do
           End If
       Loop 
       ShellAndWait = True
   Else
       MsgBox ("Couldn't execute command: " & commandLine)
       ShellAndWait = False
   End If
       
   Exit Function
  

HandleError:

   MsgBox ("Couldn't execute command: " & commandLine)
   ShellAndWait = False

End Function

Sub SpawnDir()

  ShellAndWait("dir", 10)

End Sub

</lang>