Nim: Executing external commands
Mar 21, 2022
One fairly unique aspect of executing commands that Nim has, that I've not experienced anywhere else, is staticExec
. It allows a process to be executed at compile time, and the results at that specific moment included in the build in some way. An example from the docs is to interrogate the current environment to tag the current git status and OS architectures:
// Runs at compile timeconst buildInfo = "Revision " & staticExec("git rev-parse HEAD") &"\nCompiled on " & staticExec("uname -v")
To execute a process and return the results to a variable:
let output = execProcess("nim", args=["c", "-r", "hellowworld.nim"])
If you just want the exit status:
import osproclet output = execCmd("blerk")echo output# sh: blerk: not found# 127
Or if you want exit status and output:
import osproclet (output, status) = execCmdEx("ls -a")echo status# 0echo output# . ..
If you need to get more control then startProcess
is the lower level function to call. The execProcess
function earlier was just a convenience function to make common usage simpler. Make sure to close the process when you're done:
import osproc, strutils, streamslet process = startProcess("some-interactive-process", args = ["-v"],options = {poInteractive, poUsePath})let (fromp, top) = (process.outputStream, process.inputStream)top.write "repeat this please\n"top.flushecho fromp.readLine.toUppertop.write "and this\n"top.flushecho fromp.readLine.toUpperdiscard process.waitForExitprocess.close
Hi, I'm Glenn! 👋 I've spent most of my career working with or at startups. I'm currently the Director of Product @ Ockam where I'm helping developers build applications and systems that are secure-by-design. It's time we started securely connecting apps, not networks.
Previously I led the Terraform product team @ HashiCorp, where we launched Terraform Cloud and set the stage for a successful IPO. Prior to that I was part of the Startup Team @ AWS, and earlier still an early employee @ Heroku. I've also invested in a couple of dozen early stage startups.
Previously I led the Terraform product team @ HashiCorp, where we launched Terraform Cloud and set the stage for a successful IPO. Prior to that I was part of the Startup Team @ AWS, and earlier still an early employee @ Heroku. I've also invested in a couple of dozen early stage startups.