beardedeagle
Use env variables with System.cmd or Ports?
I’m trying to figure out how to be able to expand ENV variables in either Port or System.cmd. Porcelain seems to be capable of this, but I cannot do it with either Port or System.cmd:
iex(5)> System.cmd("/bin/echo", ["$GOPATH"])
{"$GOPATH\n", 0}
iex(6)> port = Port.open({:spawn_executable, "/bin/echo"}, [:binary, args: ["$GOPATH"]])
#Port<0.10>
iex(7)> flush()
{#Port<0.10>, {:data, "$GOPATH\n"}}
:ok
Porcelain.shell("echo $GOPATH")
%Porcelain.Result{err: nil, out: "/Users/rlthompson/go\n", status: 0}
The issue is Porcelain is in a state where I am uncomfortable using it in production (it’s basically abandonware in my personal opinion). I tried taking a look at how Porcelain is accomplishing this, but was unable to make heads or tails of the specific calls they make.
Any help, direction or docs to be pointed at would be greatly appreciated. Thank you in advance.
Marked As Solved
beardedeagle
And if anyone comes to this thread looking for the same thing i was, here is how you also get the status code:
iex(18)> port = Port.open({:spawn, "/bin/echo $GOPATH"}, [:binary, :exit_status])
#Port<0.20>
iex(19)> flush
{#Port<0.20>, {:data, "/Users/rlthompson/go\n"}}
{#Port<0.20>, {:exit_status, 0}}
:ok
Also Liked
lpil
What makes you say this? It’s a well defined library that could be considered complete. It’s not like the *nix CLI is a moving target that the library needs to be updated to work with ![]()
isaacsanders
If you are trying to get a subset of your environment sent to the port, I would do so explicitly. I am under the impression from what you have posted that it doesn’t look at parameters in your shell, but requires you to set the env for the shell it creates.
beardedeagle
iex(16)> port = Port.open({:spawn, "/bin/echo $GOPATH"}, [:binary])
#Port<0.19>
iex(17)> flush
{#Port<0.19>, {:data, "/Users/rlthompson/go\n"}}
:spawn vs :spawn_executable. Now I feel dumb.
evhinesdev
I know this is ancient but ended up here on the same adventure. I see you solved it with a port but you can do this with a System.cmd with an inline “sh -c ‘CMD’” script:
System.cmd("sh", ["-c", "echo $GOPATH"], env: [{"GOPATH", "/Users/rlthompson/go"}])







