рдкрд░рд┐рдЪрдп
рдореЗрд░реЗ рдШрд░ рдХреЗ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рдЫреЛрдЯреЗ рдмрд╛рд╣рд░реА рдкреНрд░реЛрд╕реЗрд╕ рдореИрдиреЗрдЬрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрд╛рд╣рд░реА рдбреЗрдореЙрди рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ, рдЬрдм рдЗрд╕реЗ рдмрдВрдж рдХрд░рдирд╛, рдЪрд╛рд▓реВ рдХрд░рдирд╛, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрджрд▓рдирд╛ рдЖрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдореЗрдВ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрд╣реБрдд рд╣реА рджреБрд░реНрд▓рдн рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдореИрдВ рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╡рд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд░рд╣реА рд╣реИред рдФрд░ рдореИрдВ рд╕реБрдЦрдж рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдерд╛: рд╕реНрдХрд╛рд▓рд╛ рдиреЗ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ
рджреЛ
рд▓рдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреА
рдЖрдзрд╛рд░рд╢рд┐рд▓рд╛ рд╣реИрдВ: рдпреЗ
scala.sys.process.Process рдФрд░
scala.sys.process.ProcessBuilder рд╣реИрдВ ред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рдмреНрдпреВрд▓рд░ рдЖрдкрдХреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпреЗ
рдЗрдХрд╛рдЗрдпрд╛рдБ рдкреИрдХреЗрдЬ
scala.sys.process рдореЗрдВ рд╣реИрдВ ред рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдЪрд▓рд╛рдПрдБ:
scala> import scala.sys.process._ scala> val process: Process = Process("echo Hello World").run() scala> println(process.exitValue())
рд░рди рд╡рд┐рдзрд┐ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдШреЛрд╖рдгрд╛рдкрддреНрд░ ProcessBuilder
рдЯреНрд░реЗ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЪрд▓рддреА рд╣реИ, рдбреЗрдЯрд╛ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рд╣реИред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЯреНрд░реЗ рдореЗрдВ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рд╣реИрдВ:
exitValue()
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ exitValue()
рдХреЛрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИ;destroy()
- рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред
рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рдирдХ рдЬрд╛рд╡рд╛ рд╡рд░реНрдЧ java.lang.Process рдХреЗ рд╕рдорд╛рди рд╣реИред
ProcessBuilder
рдЯреНрд░реЗ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╣реИрдВред рдореИрдВ рдореБрдЦреНрдп рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджреВрдВрдЧрд╛:
!
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдХрдВрд╕реЛрд▓ рдХреЛ рдбреЗрдЯрд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдХреЛрдб рджреЗрддрд╛ рд╣реИ;!!
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдХрдВрд╕реЛрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдкреВрд░рд╛ рдХреЛрдб рд╢реВрдиреНрдп рд╕реЗ рдЕрд▓рдЧ рд╣реИ - рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реИ;lines
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рд╕реНрдЯреНрд░реАрдо [рд╕реНрдЯреНрд░рд┐рдВрдЧ] рджреЗрддрд╛ рд╣реИред рдпрд╣ рдзрд╛рдЧрд╛ рдЖрдкрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕реНрдЯреНрд░реАрдо рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рд╕реВрдЪрдирд╛ рдХреЗ рджреЛрдмрд╛рд░рд╛ рдЖрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧреА, рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИред рдпрджрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрддрд┐ рдХреЛрдб рдЧреИрд░-рд╢реВрдиреНрдп рд╣реИ, рддреЛ рд╡рд┐рдзрд┐ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧреАред рдПрдХ рдЕрдкрд╡рд╛рдж рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП_!run
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИред
рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореБрдЭреЗ рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд▓рдЧрднрдЧ рд░рди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдФрд░ рдпрд╣рд╛рдБ рд╡рд┐рдзрд┐ рд╣реИ
!
рдмрд╕ рдореЗрд░реЗ рд▓рд┐рдП рдлрд┐рдЯ рд╣реИред
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
scala> Process("echo Hello World!").! Hello World! res1: Int = 0 scala> Process("echo Hello World!").!! res2: String = "Hello World!" scala> Process("echo Hello World!").lines res3: Stream[String] = Stream(Hello World!, ?)
рдЕрд╡реИрдз рдХрд╛рд╕реНрдЯрд┐рдВрдЧ
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ (
java.lang.String ) рдФрд░ рдЕрдиреБрдХреНрд░рдо (
scala.collection.Seq ) рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ ProcessBuilder
рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИрдВ ред
рд╣рдо рдЕрдкрдирд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
scala> "echo Hello World!".! Hello World! res2: Int = 0
рдпрд╛ рддреЛ:
scala> Seq("echo", "Hello", "World!").! Hello World! res3: Int = 0
рдХрд╛рдлреА рд╣рдж рддрдХ, рдпрд╣ рд▓реЗрдЦрди рдХреЛ рдХрдо рдФрд░ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдФрд░ рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрдпреЛрдЬрди (рдкрд╛рдЗрдк)
рдкреНрд░реЛрд╕реЗрд╕ рдХреЙрд▓ рдХреЛ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдЪреЗрди рдХреЗ рд╕рдорд╛рди рдЪреЗрди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
scala> "ls".! 11.txt 1.txt 2.txt 3.txt res2: Int = 0 scala> ("ls" #| "grep 1").! 11.txt 1.txt res6: Int = 0
Ls рдХрдорд╛рдВрдб рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ grep рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред Grep рдиреЗ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ 1 рдкрд░ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ред
рдЖрдк рд╕рд╢рд░реНрдд рд╕рдВрдЪрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
scala> ("find . -name *.txt -exec grep 0 {} ;" #| "xargs test -z" #&& "echo 0-free" #|| "echo 0-exists").! 0-exists res23: Int = 0
рдпрд╣рд╛рдБ, рдпрджрд┐ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди * .txt рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рд╣реИрдВ, рддреЛ рдкрд╛рда рдореЗрдВ 0 рд╣реИ - рдпрд╣ рдЖрдЙрдЯрдкреБрдЯ 0-рдХрдВрд╕реЛрд▓ рдкрд░ рдореМрдЬреВрдж рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ 0-рдореМрдЬреВрдж рд╣реИред
#&&
- рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд▓реА рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ;
#||
- рдкрд┐рдЫрд▓реЗ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рд╕реНрдХреИрд▓рд╛ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд▓рд╛рдЗрдирдХреНрд╕ рдЬреИрд╕реЗ рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдЫреЛрдЯреЗ рд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрддрд╛ рд╣реИред
рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдЖрдИ / рдУ рд╕реНрдЯреНрд░реАрдо
рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╣рдорд╛рд░рд╛ рд╕рднреА рдХреЛрдб рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдмреЗрдХрд╛рд░ рд╣реИред
рдЕрдХреНрд╕рд░, рдЖрдкрдХреЛ рдЖрджреЗрд╢ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реБрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рд░рди рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕рдмреНрдпреВрд▓рд░ рдЯреНрд░реЗ рдореЗрдВ ;, !!, рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ, рдЖрдк
рдкреНрд░реЛрд╕реЗрд╕рд▓реЙрдЧрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рд▓рд╛рдЗрди рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдореБрджреНрд░рд┐рдд рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ
ProcessLogger рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
scala> var normalLines = 0 normalLines: Int = 0 scala> var errorLines = 0 errorLines: Int = 0 scala> val countLogger = ProcessLogger(line => normalLines += 1, | line => errorLines +=1) countLogger: scala.sys.process.ProcessLogger = scala.sys.process.ProcessLogger$$anon$1@459c8859 scala> "ls" ! countLogger res0: Int = 0 scala> println("normalLines: " + normalLines + ", errorLines: " + errorLines) normalLines: 4, errorLines: 0
ProcessLogger рдЖрдкрдХреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд░реНрдЧ
scala.sys.process.ProcessIO рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рджреЛрдиреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг:
Seq("grep", "1") run new ProcessIO((output: java.io.OutputStream) => { output.write("1.txt\n2.txt\n3.txt\n11.txt".getBytes) output.close() }, (input: java.io.InputStream) => { println(Source.fromInputStream(input).mkString) input.close() }, _.close())
рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╣реИ: рдпрд╣рд╛рдВ рд╣рдо рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред
рдкреИрд░рд╛рдореАрдЯрд░ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдмрд╛рд╣рд░реА рдХрдорд╛рдВрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╣реА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк
#<
рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░
#>
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ:
scala> ("echo -e 1.txt\\n2.txt\\n3.txt" #> new java.io.File("1.txt")).! res21: Int = 0 scala> ("grep 1" #< new java.io.File("1.txt")).!! res22: String = "1.txt"
рдЙрд╕реА рддрд░рд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рджреВрд╕рд░реА рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
scala> (new java.io.File("1.txt") #> new java.io.File("2.txt")).! res23: Int = 0 scala> "cat 2.txt".! 1.txt 2.txt 3.txt res24: Int = 0
рдирд┐рд╖реНрдХрд░реНрд╖
рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред рдЬрд╛рд╡рд╛ рдореЗрдВ, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд░реИрдкрд░реЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рддрд░рд╣ рдХреА рд╕рд╛рджрдЧреА рдХреЗ рдХрд░реАрдм рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрд╛ред рдЖрдк
http://www.scala-lang.org рдкрд░ рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╕реНрд░реЛрдд рдореЗрдВ рдЦреЛрдж рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╣рд╛рдВ рд╕реЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдпрд╛)ред jdk1.7 рдореЗрдВ, рд╣рдордиреЗ рд╡рд░реНрдЧ
java.lang.ProcessBuilder рдХреЛ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рджрд┐рдпрд╛, рдФрд░ рдЬрд╛рд╡рд╛ рдмрд╛рд╣рд░реА рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реНрдХрд╛рд▓рд╛ рдХреА рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, jdk рджреВрд░ рд╣реИред