代码拉取完成,页面将自动刷新
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
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。