刚入手mac不久,都说mac高效终端好使,今天就来推荐一个功能:自定义全局命令行脚本
就如同 全局可以执行node, npm, git 一样,现在自己也可以写这样的脚本文件,在全局任意终端可执行,这对于不想记命令行的懒人来说太方便了,我称自定义命令行脚本为:懒的最后一公里
那么shell 是什么??
以下是前端开发人员对 Shell 的一些可能的用途和概念:
- 终端和命令行工具:前端可能会使用终端或命令行工具来执行一些简单的任务,例如启动本地开发服务器node、安装依赖项npm或管理版本控制nvm。这些任务通常涉及在 Shell 中输入命令
- 工作流集成:前端开发人员可能会使用工作流集成工具,如 Grunt、Gulp 或 Webpack,这些工具可以通过配置文件执行一系列任务。这些工具通常在命令行或 Shell 中启动
下面开始配置自己的脚本执行环境
配置脚本全局可执行
- 打开终端创建一个文件夹,这里是在home下创建的,路径为/Users/neoyuan/script
mkdir ~/script
- 加入文件夹到
$PATH
vi ~/.zshrc
// 在配置文件末尾加上以下内容
export PATH=~/script:$PATH
记得 source ~/.zshrc 重新加载一下配置文件,路径配置完成✅。然后就是编写脚本命令文件
解释一下:
$PATH是一个重要的环境变量,它在 Unix/Linux 操作系统中扮演着关键的角色。它的作用是定义系统在哪些目录中寻找可执行程序(通常被称为命令)。$PATH变量包含一系列目录路径,用冒号分隔开。当你在命令行中输入一个命令时,Shell 会根据$PATH变量中的路径来查找命令的可执行文件,然后执行该命令主要作用是使系统能够轻松找到并执行命令,而不需要提供完整的文件路径
例如,当你输入
ls命令以列出当前目录中的文件和文件夹时,Shell会查看$PATH中定义的路径,找到ls的可执行文件,然后运行它。通常情况下,ls的可执行文件位于/bin/ls。你可以使用以下命令来查看当前系统的
$PATH变量的值:echo $PATH
$PATH变量通常包含一些标准目录路径,如/bin、/usr/bin、/usr/local/bin,它们包含了系统命令和用户安装的命令的可执行文件。此外,你还可以将自定义目录添加到$PATH中,以便轻松执行自定义命令或脚本。加入自定义目录的方式来添加查询目录就是实现执行全局自定义脚本的关键
自定义目录下自定义脚本
创建一个shell.sh
touch shell.sh
运行以下命令将 "shell.sh" 文件设置为可执行文件,否则无法执行
chmod +x shell.sh
写入以下内容到文件
#!/bin/sh
echo "Hello, World!"
执行一下:
nice,全局执行 自定义 脚本大门打开了
这儿文件完全可以不用加上后缀名,可以直接改名为 shell,也可以执行
mv shell.sh shell
没学过脚本语法不会写✍️, gpt可以帮助你编写简单的脚本,我也没学过
看一些在用的简单脚本
自用懒人脚本
有一次在打王者农药,正打得上头,公司同事@我给项目打包, 大概有以下的几条命令需要在依赖项包目下执行,但当时敲错好几回
# 单个依赖打包
// 要把 package.json 里面的version 版本号 +1
npm run lib
# 上传git 需要加上--no-verify 和 --set-upstream origin
git add .
git commit -m '3.2.19.7-230208-JLQC-hotfix.4' --no-verify
npm publish --tag v3-2-20-4-JLQC-hotfix
git push --set-upstream origin papaas-3.2.19.7-230208-JLQC-hotfix
听后端同事yzei说过脚本,于是萌生了写脚本的想法。这里只有两个参数 分支名和 commit 信息是动态的, tag 通过处理分支名就可以得到,让gpt生成并改了几次得到以下内容:
#!/bin/bash
# 设置当任何命令执行失败时退出脚本
set -e
# 设置当脚本退出时打印异常信息
trap 'echo "出现异常:$?"' EXIT
# 清空原来的日志文件
>/Users/neoyuan/bin/log.log
# 定义一个函数来转换版本字符串
convertVersionString() {
local version=${1/papaas-/v} # 将 papaas- 替换为 v
version=${version//./-} # 将所有的 . 替换为 -
echo $version # 返回转换后的版本字符串
}
# 定义一个函数来执行发布命令
publishCommand() {
local branchName=$1 # 获取第一个参数作为分支名
local versionName=$2 # 获取第二个参数作为版本名
local tagName=$(convertVersionString $branchName) # 调用函数转换版本字符串
# 执行模板中的命令,并且将输出日志保存到 /Users/neoyuan/bin/log.log 文件中
git pull origin $branchName 2>&1 | tee -a /Users/neoyuan/bin/log.log || exit 1
npm run lib 2>&1 | tee -a /Users/neoyuan/bin/log.log || exit 1
git add . 2>&1 | tee -a /Users/neoyuan/bin/log.log || exit 1
git commit -m "$versionName" --no-verify 2>&1 | tee -a /Users/neoyuan/bin/log.log || exit 1
nrm use drc 2>&1 | tee -a /Users/neoyuan/bin/log.log || exit 1
nrm ls 2>&1 | tee -a /Users/neoyuan/bin/log.log || exit 1
npm publish --tag $tagName 2>&1 | tee -a /Users/neoyuan/bin/log.log || exit 1
git push --set-upstream origin $branchName 2>&1 | tee -a /Users/neoyuan/bin/log.log || exit 1
nrm use dget 2>&1 | tee -a /Users/neoyuan/bin/log.log || exit 1
}
# 参数校验
if [ -z "$1" ]; then
echo "Branch name parameter required."
exit 1
fi
# 参数校验
if [ -z "$2" ]; then
echo "version parameter required."
exit 1
fi
# 使用传递给脚本的两个参数作为 branchName 和 versionName 变量的值
branchName=$1
versionName=$2
# 调用函数执行发布命令
publishCommand $branchName $versionName
echo '日志地址:/Users/neoyuan/bin/log.log'
# 等待用户输入一个字符,阻止脚本立马退出
# read -n1 -r -p "按任意键继续..." key
好用👌
还有另一个
#!/bin/sh
# 删除当前路径下的 package-lock.json 文件
rm -rf package-lock.json
# 执行 npm install
npm install
# 输出“依赖安装成功”,颜色为绿色
echo -e "\033[32m 依赖安装成功 \033[0m"
```
命令别名alias
后面听后端yzei说:alias可以给命令起别名, eg:
alias nv='node -v'
nv // 执行之后输出node版本号 v18.18.0
这就对复杂常用命令有一个好的简写帮助👍🏻,还可以写到zshrc里面,这样全局终端都能够使用别名
结语
把常用的一条条输入的命令都写成脚本文件吧,好像也能执行JavaScript脚本。全局可执行命令脚本这可太酷了,净是别人看不懂的命令语法糖