shell调试和前端集成 | 青训营笔记

144 阅读1分钟

调试

1.普通log,使用echo、printf

#!/bin/sh
a=1
d=(1 2 3 4 5)
echo $a
echo ${d[3]}
echo ${d[@]}
#输出
#1
#4
#1 2 3 4 5

2.使用set命令

set配置作用补充
-u遇到不存在的变量就会报错,并停止执行-o nounset
-x运行结果之前,先输出执行的那一行命令-o xtrace
-e只要发生错误,就终止执行-o errexit
-o pipefail管道符链接的,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行

一般我们会在shell最开头的时候用set进行这些配置,配置项根据不同的shell会有所不同,以上是比较通用的配置项

#!/bin/sh
set -uex -o pipefail
echo "hello world"

3.vscode debug插件

vscode配置

1.shellman:代码提示和自动补全

2.shellcheck:代码语法校验

3.shell-format:代码格式化

与js当中的eslink和prettier相似

4.Bash Debug:支持单步调试

  • 安装vscode插件
  • 编写launch.json文件
  • 升级bash到4.x以上版本
# 1.安装最新版本bash
    brew install bash
# 2.查看安装路径
    which -a bash
# 3.将新版本bash路径加入PATH
    PATH="/usr/local/bin/bash:$PATH"
# 4.配置vscode launch.json启动文件
    {
        "version":"0.2.0",
        "configurations":[
            {
                "type":"bashdb",
                "request":"launch",
                "name":"Bash-Debug(simplest configuration)",
                "cwd":"${workspaceFolder}",
                "program":"debug.sh"
            }
        ]
    }

前端集成

1.node中通过exec、spawn调用shell命令

const { exec } = require('child_process');
exec('ls',['-l'],(err,stdout,strerr) => {
    if(err){
        console.error(err);
    }
    stdout && console.log(stdout)
})

exec会启动一个子shell去执行传入的命令,并且将命令执行的结果保存在缓存区,执行完毕之后将缓冲区的结果返回到回调函数当中来。缓冲区是有大小限制的,默认是200KB,如果超过这个限制就会报错。

spawn不会启动一个子shell进程,会返回一个流对象,直接对这个流对象进行写入和读取的操作,没有大小限制,所以它比较适合大数据量的操作。

2.shell脚本中调用node命令

#!/bin/bash
set -e
node ./exec.js
echo 'success'

3.借助zx等库进行javascript、shell script的融合

  • 借助shell完成系统操作,文件io、内存、磁盘系统状态查询等
  • 借助nodejs完成应用层能力,网络io、计算等
#!/usr/bin/env zx
let files=await $`ls -a | grep node`
console.log(chalk.blue(`files : ${files}.`))
await sleep(1000)
await fetch('https://google.com')
let answer=await question('do you want to create new dir ?');
if(answer==='y'){
    await $`mkdir temp`
}

===:"严格相等",它比两个等号更严格,将在比较时考虑数据类型。

shell调用:$`command`