README.md

# Nerves Runtime Shell

A custom shell for debugging and running commands on Nerves devices in a `bash`-like environment.

---

Nerves devices typically only expose an Elixir or Erlang shell prompt. While
this is handy, some tasks are easier to run in a more `bash`-like shell
environment. The `nerves_runtime` shell provides a limited CLI that can be run
without leaving the Erlang runtime.

Here's an example of how to use access it:

```
iex(1)> [Ctrl+G]
User switch command
 --> s sh
 --> j
   1  {erlang,apply,[#Fun<Elixir.IEx.CLI.1.112225073>,[]]}
   2* {sh,start,[]}
 --> c
Nerves Interactive Command Shell

Type Ctrl+G to exit the shell and return to Erlang job control.
This is not a normal shell, so try not to type Ctrl+C.

/srv/erlang[1]>
```

There are a few caveats to using this shell for now:

1.  For projects generated by `nerves_bootstrap` prior to v0.5.0, the default
    behavior of `Ctrl+C Ctrl+C` is to exit the Erlang VM and reboot or hang your
    system, depending on how `erlinit` is configured. For projects generated by
    `nerves_bootstrap` v0.5.0 or later, the `rel/vm.args` file has the `+Bc`
    option included, which allows the Erlang VM to respond to an interrupt
    generated by `Ctrl+C`:

    ```
    iex(1)> # Press CTRL+C
    iex(2)> ** (EXIT) interrupted

    iex(2)> :timer.sleep(1_000_000_000)
    ** (EXIT) interrupted
    iex(2)>
    User switch command
     --> s sh
     --> c
    Nerves Interactive Command Shell

    Type Ctrl+G to exit the shell and return to Erlang job control.
    This is not a normal shell, so try not to type Ctrl+C.

    /srv/erlang[1]> ls
    releases
    lib

    /srv/erlang[2]> Interrupted
    /srv/erlang[2]> Interrupted
    ```

2.  If you want to upgrade an existing project to have this new behavior, simply
    add `+Bc` on a line before the `-extra` line in `rel/vm.args`. Or, as a
    workaround without making that change, start another shell using `Ctrl+G`
    and `kill` the offending program.
3.  Commands are run asynchronously. This is unexpected if you're used to a
    regular shell. For most commands, it's harmless. One side effect is that if
    a command changes the current directory, it could be that the prompt shows
    the wrong path.
4.  Starting the shell on a remote node (for example, using `remsh`) is not 
    currently supported.

## Installation

The package can be installed by adding `nerves_runtime_shell` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:nerves_runtime_shell, "~> 0.1.0"}
  ]
end
```