Customizing the environment
The type returned by the Process
constructor also implements the ProcessConfiguration
trait,
adding three methods that can be used to customize the working environment of the process to be started:
Working directory
The in
method can be used to customize the working directory:
import io.github.vigoo.prox.path._
val dir = home / "tmp"
// dir: java.nio.file.Path = /home/runner/tmp
val proc1 = Process("ls") in dir
// proc1: Process.ProcessImpl = ProcessImpl(
// command = "ls",
// arguments = List(),
// workingDirectory = Some(value = /home/runner/tmp),
// environmentVariables = Map(),
// removedEnvironmentVariables = Set(),
// outputRedirection = StdOut(),
// runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@2eb4bf64,
// errorRedirection = StdOut(),
// runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@497fbb3f,
// inputRedirection = StdIn()
// )
Not that dir
has the type java.nio.file.Path
, and the home / tmp
syntax is just a thin
syntax extension to produce such values.
Adding environment variables
The with
method can be used to add environment variables to the process in the following
way:
val proc2 = Process("echo", List("$TEST")) `with` ("TEST" -> "Hello world")
// proc2: Process.ProcessImpl = ProcessImpl(
// command = "echo",
// arguments = List("$TEST"),
// workingDirectory = None,
// environmentVariables = Map("TEST" -> "Hello world"),
// removedEnvironmentVariables = Set(),
// outputRedirection = StdOut(),
// runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@5171baaf,
// errorRedirection = StdOut(),
// runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@1d4e323c,
// inputRedirection = StdIn()
// )
Removing environment variables
The subprocess inherits the parent process environment, so it may be necessary to
remove some already defined environment variables with the without
method:
val proc3 = Process("echo" , List("$PATH")) `without` "PATH"
// proc3: Process.ProcessImpl = ProcessImpl(
// command = "echo",
// arguments = List("$PATH"),
// workingDirectory = None,
// environmentVariables = Map(),
// removedEnvironmentVariables = Set("PATH"),
// outputRedirection = StdOut(),
// runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@7cbb3028,
// errorRedirection = StdOut(),
// runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@3e7b00a1,
// inputRedirection = StdIn()
// )
Writing reusable functions
Because these methods are part of the ProcessConfiguration
capability, writing reusable functions require us to define
a polymorphic function that requires this capability:
import java.nio.file.Path
def withHome[P <: ProcessLike with ProcessLikeConfiguration](home: Path, proc: P): P#Self =
proc `with` ("HOME" -> home.toString)
Then we can use it on any kind of process or process group (read about redirection to understand why there are multiple concrete process types):
val proc4 = Process("echo", List("$HOME"))
// proc4: Process.ProcessImpl = ProcessImpl(
// command = "echo",
// arguments = List("$HOME"),
// workingDirectory = None,
// environmentVariables = Map(),
// removedEnvironmentVariables = Set(),
// outputRedirection = StdOut(),
// runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@62037103,
// errorRedirection = StdOut(),
// runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@e3070ad,
// inputRedirection = StdIn()
// )
val proc5 = withHome(home, proc4)
// proc5: Process.ProcessImpl#Self = ProcessImpl(
// command = "echo",
// arguments = List("$HOME"),
// workingDirectory = None,
// environmentVariables = Map("HOME" -> "/home/runner"),
// removedEnvironmentVariables = Set(),
// outputRedirection = StdOut(),
// runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@62037103,
// errorRedirection = StdOut(),
// runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@e3070ad,
// inputRedirection = StdIn()
// )
val group1 = Process("grep", List("ERROR")) | Process("sort")
// group1: ProcessGroup.ProcessGroupImpl = ProcessGroupImpl(
// firstProcess = ProcessImplO(
// command = "grep",
// arguments = List("ERROR"),
// workingDirectory = None,
// environmentVariables = Map(),
// removedEnvironmentVariables = Set(),
// outputRedirection = OutputStreamThroughPipe(
// pipe = io.github.vigoo.prox.ProxFS2$$Lambda$10722/0x00000008026f6840@2baf2b33,
// runner = io.github.vigoo.prox.SyntaxModule$ProcessPiping$$Lambda$10723/0x00000008026f4840@4db758ef,
// chunkSize = 8192
// ),
// runOutputStream = io.github.vigoo.prox.ProcessModule$Process$ProcessImpl$$Lambda$10724/0x00000008026f7840@3445b333,
// errorRedirection = StdOut(),
// runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@39fd180e,
// inputRedirection = StdIn()
// ),
// innerProcesses = List(),
// lastProcess = ProcessImpl(
// command = "sort",
// arguments = List(),
// workingDirectory = None,
// environmentVariables = Map(),
// removedEnvironmentVariables = Set(),
// outputRedirection = StdOut(),
// runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@6b595ab1,
// errorRedirection = StdOut(),
// runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@1cde0715,
// inputRedirection = StdIn()
// ),
// originalProcesses = List(
// ProcessImpl(
// command = "sort",
// arguments = List(),
// workingDirectory = None,
// environmentVariables = Map(),
// removedEnvironmentVariables = Set(),
// outputRedirection = StdOut(),
// runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@6b595ab1,
// errorRedirection = StdOut(),
// runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@1cde0715,
// ...
val group2 = withHome(home, group1)
// group2: ProcessGroup.ProcessGroupImpl#Self = ProcessGroupImpl(
// firstProcess = ProcessImplO(
// command = "grep",
// arguments = List("ERROR"),
// workingDirectory = None,
// environmentVariables = Map("HOME" -> "/home/runner"),
// removedEnvironmentVariables = Set(),
// outputRedirection = OutputStreamThroughPipe(
// pipe = io.github.vigoo.prox.ProxFS2$$Lambda$10722/0x00000008026f6840@2baf2b33,
// runner = io.github.vigoo.prox.SyntaxModule$ProcessPiping$$Lambda$10723/0x00000008026f4840@4db758ef,
// chunkSize = 8192
// ),
// runOutputStream = io.github.vigoo.prox.ProcessModule$Process$ProcessImpl$$Lambda$10724/0x00000008026f7840@3445b333,
// errorRedirection = StdOut(),
// runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@39fd180e,
// inputRedirection = StdIn()
// ),
// innerProcesses = List(),
// lastProcess = ProcessImpl(
// command = "sort",
// arguments = List(),
// workingDirectory = None,
// environmentVariables = Map("HOME" -> "/home/runner"),
// removedEnvironmentVariables = Set(),
// outputRedirection = StdOut(),
// runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@6b595ab1,
// errorRedirection = StdOut(),
// runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@1cde0715,
// inputRedirection = StdIn()
// ),
// originalProcesses = List(
// ProcessImpl(
// command = "sort",
// arguments = List(),
// workingDirectory = None,
// environmentVariables = Map(),
// removedEnvironmentVariables = Set(),
// outputRedirection = StdOut(),
// runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@6b595ab1,
// errorRedirection = StdOut(),
// runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@1cde0715,
// ...