1 Star 0 Fork 1

yss930819/gf-ex

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
cmd_shell.go 1.91 KB
一键复制 编辑 原始数据 按行查看 历史
package yscmd
import (
"fmt"
"gitee.com/kmyss/gf-ex/ysbuild"
"gitee.com/kmyss/gf-ex/yscommon/ysansi"
"gitee.com/kmyss/gf-ex/yslog"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gcmd"
"github.com/gogf/gf/text/gstr"
"os"
"os/signal"
"time"
)
const CMD_SHELL = "shell"
type CmdShellBuilder struct {
CommandBuilderCore
isKillRuning bool
}
func (b *CmdShellBuilder) SetFlag(builder IFlagBuilder, _ ...string) bool {
return false
}
func (b *CmdShellBuilder) Init() {
b.C = NewDefaultCommand()
b.C.Run = b.run
b.C.Use = CMD_SHELL
b.C.Short = "进入命令行控制模式"
}
func (b *CmdShellBuilder) SetChildCommand(builder ICommandBuilder) bool {
return false
}
// run 命令行模式运行程序
func (b *CmdShellBuilder) run(c *Command) {
if g.IsEmpty(c.parent.parent) {
ysbuild.PrintLogo()
ysbuild.PrintAppInfo()
}
go b.kill()
yslog.Printf(`进入 %s 命令的 shell 模式
- 使用 %s 查看更多帮助信息
- 返回上一级或退出请使用 %s`,
c.parent.Use,
ysansi.LightGreenStr("`help`"),
ysansi.LightRedStr("`exit`"),
)
for {
args := ScanAndLog(fmt.Sprintf("(%s)>> ", c.parent.Use))
if args == "exit" {
return
} else if gstr.HasPrefix(args, "shell") {
yslog.Print("已在 Shell 模式下,此命令不可用")
continue
} else if len(args) == 0 {
time.Sleep(50 * time.Millisecond)
continue
}
yslog.DebugV("父命令: ", c.parent.Use)
yslog.DebugV("执行命令: ", args)
// 将当前命令初始化进去
gcmd.Init(append(g.SliceStr{c.parent.Use}, gstr.Split(args, " ")...)...)
c.parent.Exec()
gcmd.Init(os.Args...)
if !b.isKillRuning {
go b.kill()
}
}
}
func (b *CmdShellBuilder) kill() {
b.isKillRuning = true
signals := make(chan os.Signal)
signal.Notify(signals, os.Interrupt)
for {
select {
case <-signals:
yslog.Print("\n请再次点击 Ctrl + C")
signal.Reset(os.Interrupt)
b.isKillRuning = false
return
}
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/kmyss/gf-ex.git
git@gitee.com:kmyss/gf-ex.git
kmyss
gf-ex
gf-ex
v0.8.1

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385