利用yock编写批处理脚本,替代batch和shell

ansurfen · · 1352 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在上一个[文章](https://studygolang.com/articles/36225)当中,我们已经搭建出了yock基本的运行环境。本期,我将带大家进一步了解yock的使用。 在日常开发过程中,提到批处理语言,想必最先映入眼帘的一定是batch, shell为首的原生批处理脚本。无论是shell还是batch,对于不熟悉或者不习惯使用他的人来说无疑是一种灾难,在使用起来。他不像我们开发当中经常接触的python, js这类语言一样,有强大的代码提示,语法检测甚至还有类型检测,同时资料有时候又少之又少。哪怕在gptchat如此普及的今天,让gpt写批处理脚本依旧是漏洞百出。而yock,就很好的解决了这一点。 `注意`: 由于GNU命令过于庞杂,因此对于相关函数以代码和注释的形式穿插介绍。如果文字版教程不便理解,可以移到文章末尾处,有视频教程的链接。 ## 原生执行 调用终端直接执行,对于不同平台相同命令不同flag并不具备适配的能力。因此,如果你想获得更好的跨平台能力,最好仅使用原本就跨平台的命令。例如,支持跨平台的命令: go mod, npm; 不支持跨平台的命令: 操作系统原生命令(tasklist, ps)。 ``` -- 根据环境取别名,这个别名是存在于yock内存中的,而不是直接在终端执行 local env = "dev" if env == "dev" then alias("CC", "go.exe") else alias("CC", "go") end -- unalias("CC") -- 删除映射 -- 调用子进程执行,在执行前会先映射别名 sh("$CC version") -- 以下为sh命令不同重载形式 sh("echo a", "echo b") sh([[ echo a echo b ]]) ``` ## IO相关 ``` mkdir("a", "b") -- 创建a, b目录 -- ls命令返回include目录下面子文件和子目录,以数组的形式 -- 在lua中数组和map都共用在table数据结构中 local res = ls("include") if type(res) == "table" then -- 类型判断是否为数组 table.dump(res) elseif type(res) == "string" then -- 判断是否为字符串,可以利用awk grep提取,而不是对象化操作数据 print(res) end -- 清屏 clear() -- 创建一个a.txt的空文件 touch("a.txt") -- 输出到屏幕上 echo("Hello", "World") -- fd 为 file descriptor 文件描述符的缩写, stdout 为屏幕 -- mode c (创建) | t (覆盖写) | rw(读写打开) 文件打开的模式 echo({ fd = { "stdout", "test.txt" }, mode = "c|t|rw" }, "Hello World!") -- mode a(追加写) echo({ fd = { "stdout", "test.txt" }, mode = "c|a|rw" }, "Hello World!") -- 类比rmdir 只能删除没有文件的空目录 rm("a") -- 不安全的删除,会递归删除a目录下所有文件和子目录 rm({ safe = false }, "a") -- 将a目录拷贝到b目录下 cp("a", "b") -- 递归将src拷贝到dst下面,map接受的参数为 源目录(src)->目标目录(dst) cp({recurse = true}, { ["a"] = "b" }) -- 将a目标移动到b目录下面,这是递归的 mv("a", "b") -- 读取a.txt的内容 print(cat("a.txt")) -- 等待用户输入从键盘 read("name") sh([[echo "Hello $name"]]) ``` ## 工作区相关 ``` cd("..") --- 返回当前工作目录 print(pwd()) -- 获取yock可执行文件的绝对路径 print(whereis("yock")) -- 向环境变量写入a = b, 注意这是永久性 export("a", "b") -- 向环境变量a追加写 export("a:c") -- 删除环境变量a unset("a") ``` ## 权限相关 ``` -- 查看当前用户 print(whoami()) -- 类比 chmod 777 yock.exe chmod("yock.exe", 777) -- chown("") -- 以管理员权限打开 sudo("yock") ``` ## 进程相关 ``` -- 启动后台进程 nohup("yock") -- 打印出pid为20的进程列表 table.dump(ps(20)) -- 打印出启用命令为yock的进程列表 table.dump(ps("yock")) -- 不过滤进程列表 ps({}) -- 显示进程的某些参数,如运行的用户,内存信息,CPU信息,启动时间 ps({ user = true, mem = true, cpu = true, time = true }) -- 显示命令为test的进程列表 local procs = pgrep("test") for i = 1, #procs, 1 do print(procs[i].Pid, procs[i].Name) end -- 杀死指定进程,有两种重载,一个模糊匹配命令,一个为PID kill("test") kill(8080) ``` ## 网络相关 ``` table.dump(ifconfig()) -- 根据端口号查找相应的信息 print("PID", "Proto", "State","Local") for _, info in ipairs(lsof(58838)) do print(info.pid, info.proto, info.state, info.Local) end ``` ## 结尾 除了上面介绍的命令外,yock还包含了如curl(能够简单的发送formdata和json), grep, systemctl等命令,你可以在[官方文档](https://ansurfen.github.io/YockNav/zh/guide/gnu.html)中查询,或者查看本章[视频教程](https://www.bilibili.com/video/BV1oh4y1c7AP)。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1352 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传