zpeters
System.cmd results as a string?
I feel like i’m missing something really basic here but for the life of me cannot figure this out.
When i run System.cmd(“echo”, [“hello”]). I get the output i expect, namely {“hello\n”, 0}
However when i run System.cmd(“lynx”, [“–dump”, “http://google.com”]) I get something like this
{<<10, 32, 32, 32, 83, 101, 97, 114, 99, 104, 32, 91, 49, 93, 73, 109, 97, 103,
101, 115, 32, 91, 50, 93, 77, 97, 112, 115, 32, 91, 51, 93, 80, 108, 97, 121,
32, 91, 52, 93, 89, 111, 117, 84, 117, 98, 101, 32, 91, …>>, 0}
When i run lynx --dump http://google.com from a shell it appears to be a normal string that is output. I don’t understand why running this command in elixir gives me a binary result.
If this is unavoidable, is there a way to convert from this binary to a string?
Thank you in advance for the schooling! ![]()
Most Liked
axelson
A String in Elixir is actually a UTF-8 encoded binary: https://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html
So both of your results are binaries. One way to verify/play with this is to run
iex(30)> i "hello\n"
Term
"hello\n"
Data type
BitString
Byte size
6
Description
This is a string: a UTF-8 encoded binary. It's printed surrounded by
"double quotes" because all UTF-8 encoded codepoints in it are printable.
Raw representation
<<104, 101, 108, 108, 111, 10>>
Reference modules
String, :binary
Implemented protocols
Collectable, Ecto.DataType, Ecto.Queryable, IEx.Info, Inspect, List.Chars, Msgpax.Packer, Phoenix.HTML.Safe, Phoenix.Param, Plug.Exception, Poison.Decoder, Poison.Encoder, Slugify, String.Chars, Timber.Eventable
From there you can see the raw “binary” representation is <<104, 101, 108, 108, 111, 10>> and if you enter that into an iEX prompt you get back the string “hello\n” (note: this only works for binaries that are valid UTF-8 and all the characters are printable)
iex(31)> <<104, 101, 108, 108, 111, 10>>
"hello\n"
So for some reason lynx is returning invalid UTF-8 when run as lynx --dump http://google.com. To strip invalid characters you could do some processing like so:
iex(39)> {string, _} = System.cmd("lynx", ["--dump", "http://google.com"])
{<<10, 32, 32, 32, 83, 101, 97, 114, 99, 104, 32, 91, 49, 93, 73, 109, 97, 103,
101, 115, 32, 91, 50, 93, 77, 97, 112, 115, 32, 91, 51, 93, 80, 108, 97, 121,
32, 91, 52, 93, 89, 111, 117, 84, 117, 98, 101, 32, 91, ...>>, 0}
iex(40)> String.graphemes(string) |> Enum.filter(&String.valid?/1) |> Enum.join("") |> IO.puts
Search [1]Images [2]Maps [3]Play [4]YouTube [5]News [6]Gmail [7]Drive
[8]More
[9]Web History | [10]Settings | [11]Sign in
[12]Day 5 of the Doodle Snow Games!
_______________________________________________________
Google Search I'm Feeling Lucky [13]Advanced search
[14]Language tools
[15]Advertising Programs [16]Business Solutions [17]+Google
[18]About Google
2018 - [19]Privacy - [20]Terms
References
1. http://www.google.com/imghp?hl=en&tab=wi
2. http://maps.google.com/maps?hl=en&tab=wl
3. https://play.google.com/?hl=en&tab=w8
4. http://www.youtube.com/?gl=US&tab=w1
5. http://news.google.com/nwshp?hl=en&tab=wn
6. https://mail.google.com/mail/?tab=wm
7. https://drive.google.com/?tab=wo
8. https://www.google.com/intl/en/options/
9. http://www.google.com/history/optout?hl=en
10. http://www.google.com/preferences?hl=en
11. https://accounts.google.com/ServiceLogin?hl=en&passive=true&continue=http://www.google.com/
12. http://www.google.com/search?site=&ie=UTF-8&q=Winter+Olympics&oi=ddle&ct=doodle-snow-games-day-7-5009413877268480-lawcta&hl=en&kgmid=/m/03tng8&sa=X&ved=0ahUKEwi5q-6Bo6TZAhVY62MKHdNJB3wQPQgC
13. http://www.google.com/advanced_search?hl=en&authuser=0
14. http://www.google.com/language_tools?hl=en&authuser=0
15. http://www.google.com/intl/en/ads/
16. http://www.google.com/services/
17. https://plus.google.com/116899029375914044550
18. http://www.google.com/intl/en/about.html
19. http://www.google.com/intl/en/policies/privacy/
20. http://www.google.com/intl/en/policies/terms/
:ok
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









