Skip to content
/ cmd Public
forked from xjj59307/cmd

A library to run commands easily on Unix platforms.

License

Notifications You must be signed in to change notification settings

dakusui/cmd

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cmd

A library for Java 8 to run a shell command easily on Unix platforms.

Creating a program that executes a shell command from Java is a tedious task but there are a lot of pitfalls which we almost always fall whenever we write a program to use Runtime#exec() method.

This library does it well on behalf of you.

To run echo hello, you can simply do either

  public class BasicExample {
    public void echoLocally() { 
      Cmd.cmd("echo hello").stream().forEach(System.out::println);
    }

    // or

    public void echoLocallyWithExplicitShell() { 
      Cmd.cmd(Shell.local(), "echo hello").stream().forEach(System.out::println);
    }
  }

Examples above will print out a string hello to stdout.

To do it over ssh, do (make sure you can login yourHost with yourName without password before trying this)

  public class SshExample {
    public void echoRemotely() { 
      Cmd.cmd(Shell.ssh("yourName", "yourHost"), "echo hello").stream().forEach(System.out::println);
    }
  }

If you want to specify an identity file (ssh key), you can do

  public class SshExample {
    public void echoRemotelyWithIdentityFile() { 
      Cmd.cmd(Shell.ssh("yourName", "yourHost", "/home/yourName/.ssh/id_rsa"), "echo hello").connect().forEach(System.out::println);
    }
  }

Enjoy.

Installation

cmd requires Java SE8 or later. Following is a maven coordinate for it.

  <dependency>
    <groupId>com.github.xjj59307</groupId>
    <artifactId>cmd</artifactId>
    <version>[0.11.0,)</version>
  </dependency>

More examples

Redirection

You can pipe commands not only using | in command line string but also using connect method. This allows you to make your command line string structured and programmable.

$ sh -c 'echo hello && echo world' | cat -n | sort -r | sed 's/hello/HELLO/' | sed -E 's/^ +//'

A command line above can be written as following with cmd.

    import static com.github.dakusui.cmd.Cmd.cmd;

    public class PipeExample {
      public void pipe() {
        cmd("echo hello && echo world").connect(
            cmd("cat -n").connect(
                cmd("sort -r").connect(
                    cmd("sed 's/hello/HELLO/'").connect(
                        cmd("sed -E 's/^ +//'")
                    )))
        ).stream(
        ).map(
            s -> String.format("<%s>", s)
        ).forEach(
            System.out::println
        );
      }
    }

The example above will print something like following.


<2	world>
<1	HELLO>

This can be written in a following way, too.

    import static com.github.dakusui.cmd.Cmd.cmd;

    public class PipeExample {
      public void pipedCommands() {
        cmd("echo hello && echo world").connect(
            cmd("cat -n | sort -r | sed 's/hello/HELLO/' | sed -E 's/^ +//'")
        ).stream(
        ).map(
            s -> String.format("<%s>", s)
        ).forEach(
            System.out::println
        );
      }
    }

Tee

You can tee an output from a command into other commands like a unix command of the name.

    import static com.github.dakusui.cmd.Cmd.cat;
    import static com.github.dakusui.cmd.Cmd.cmd;

    public class TeeExample {
      public void tee10K() {
        cmd(
            "seq 1 10000"
        ).connect(
            cat().pipeline(
                stream -> stream.map(
                    s -> "LEFT:" + s
                )
            )
        ).connect(
            cat().pipeline(
                stream -> stream.map(
                    s -> "RIGHT:" + s
                )
            )
        ).stream(
        ).forEach(
            System.out::println
        );
      }
    }
    

This will print following output to stdout.

RIGHT:1
RIGHT:2
LEFT:1
RIGHT:3
LEFT:2
RIGHT:4
RIGHT:5
...

About

A library to run commands easily on Unix platforms.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Languages

  • Java 100.0%