ishell is an interactive shell library for creating interactive cli applications.
The current master is not backward compatible with older version. Kindly change your import path to gopkg.in/abiosoft/ishell.v1
.
Older version of this library is still available at https://gopkg.in/abiosoft/ishell.v1.
However, you are advised to upgrade.
import "strings"
import "github.com/abiosoft/ishell"
func main(){
// create new shell.
// by default, new shell includes 'exit', 'help' and 'clear' commands.
shell := ishell.New()
// display welcome info.
shell.Println("Sample Interactive Shell")
// register a function for "greet" command.
shell.AddCmd(&ishell.Cmd{
Name: "greet",
Help: "greet user",
Func: func(c *ishell.Context) {
c.Println("Hello", strings.Join(c.Args, " "))
},
})
// start shell
shell.Start()
}
Execution
Sample Interactive Shell
>>> help
Commands:
clear clear the screen
greet greet user
exit exit the program
help display help
>>> greet Someone Somewhere
Hello Someone Somewhere
>>> exit
$
// simulate an authentication
shell.AddCmd(&ishell.Cmd{
Name: "login",
Help: "simulate a login",
Func: func(c *ishell.Context) {
// disable the '>>>' for cleaner same line input.
c.ShowPrompt(false)
defer c.ShowPrompt(true) // yes, revert after login.
// get username
c.Print("Username: ")
username := c.ReadLine()
// get password.
c.Print("Password: ")
password := c.ReadPassword()
... // do something with username and password
c.Println("Authentication Successful.")
},
})
Execution
>>> login
Username: someusername
Password:
Authentication Successful.
Builtin support for multiple lines.
>>> This is \
... multi line
>>> Cool that << EOF
... everything here goes
... as a single argument.
... EOF
User defined
shell.AddCmd(&ishell.Cmd{
Name: "multi",
Help: "input in multiple lines",
Func: func(c *ishell.Context) {
c.Println("Input multiple lines and end with semicolon ';'.")
lines := c.ReadMultiLines(";")
c.Println("Done reading. You wrote:")
c.Println(lines)
},
})
Execution
>>> multi
Input multiple lines and end with semicolon ';'.
>>> this is user defined
... multiline input;
You wrote:
this is user defined
multiline input;
Builtin interrupt handler.
>>> ^C
Input Ctrl-C once more to exit
>>> ^C
Interrupted
exit status 1
Custom
shell.Interrupt(func(c *ishell.Context) { ... })
// Read and write history to $HOME/.ishell_history
shell.SetHomeHistoryPath(".ishell_history")
Available here.
go run example/main.go
- Linux
- OSX
- Windows [Not tested but should work]
ishell is in active development and can still change significantly.
- Multiline inputs.
- Command history.
- Customizable tab completion.
- Handle ^C interrupts.
- Subcommands and help texts.
- Scrollable paged output.
- Coloured outputs.
- Testing, testing, testing.
- Create an issue to discuss it.
- Send in Pull Request.
MIT
Library | Use |
---|---|
github.com/flynn-archive/go-shlex | splitting input into command and args. |
gopkg.in/readline.v1 | history, tab completion and reading passwords. |
bitcoin:1GTHYEDiy2C7RzXn5nY4wVRaEN2GvLjwZN