一种保存常用脚本的方式

2021 年 11 月 24 日

背景问题说明

将常用脚本放在一处是个方便的做法,实现方式也很多,但常见的实现方式有以下问题:

  • bash 配置中使用 alias / function 等方式,如 .bashrc / .bash_profile 等;这种做法有以下几个问题:
    • 脚本会跟已有的文件内容混合,显得混乱
    • 修改脚本需要重新加载,调试起来比较麻烦
  • 写一个大脚本,将所有的小脚本放进去;这种做法的缺点在于:
    • 大脚本想写好的话,比较复杂
    • 调试起来不方便
  • 将所有脚本放到一个文本文件中,需要的时候从里面拷贝出来;这种做法的缺点在于:
    • 使用不便
  • 每个小脚本写一个文件,所有小脚本放到一个目录中;这种做法的缺点在于:
    • 当脚本数量增多时,记忆这些脚本名称,也成为记忆的负担
    • 对于有参数的脚本,需要执行脚本才能看到脚本使用方式

解决方案

有一种较好的方式,可以一次解决上面的问题。具体来说,是利用 just 这个命令行解释器。

实现的关键点,在于按顺序执行以下几个步骤:

  1. 安装 just ,方法很多,我使用 cargo 安装;这样得到一个可执行的 just 命令
  2. 将所有脚本放在同一个 justfile 中,放到一个方便访问的位置,比如 ~/ ;作为辅助,可以将默认(第一个) receipt 作为 help,内容包括:
    1. 打印一些环境变量,
    2. 通过 --list 打印该 justfile 所包含的 receipt
  3. 使用alias方式简化 just 的调用命令(比如用 j ),通过 --justfile--working-directory 指定共用的 justfile 和当前目录

经过以上几步后,能做到以下几点:

  1. 所有小脚本集中在 ~/justfile 中
  2. 在任何路径下,通过 j 命令,可以查看共用脚本中的默认 help
  3. 在任何路径下,通过 j 命令,配合参数,可以执行目标脚本
  4. 使用just命令,可以执行当前目录下的just脚本(注意:不是 ~/justfile)

具体范例

Windows环境

Windows7以上使用PowerShell,需要修改下面两个文件:

# %USERPROFILE%\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

Function EXEC_JUST {just --justfile $env:USERPROFILE\justfile --working-directory . $args}

Set-Alias -Name j -Value EXEC_JUST
# %USERPROFILE%\justfile

# pwsh.exe is latest store version of PowerShell
# powershell.exe is windows default version of PowerShell
# cmd.exe is for windows older than XP
set shell := ["pwsh.exe", "-c"]

help:
	@Write-Host "Shell='pwsh.exe', Dir='$PWD', Using '$env:USERPROFILE\justfile'"
	@just --justfile $env:USERPROFILE\justfile --list

ps-show-version:
	Get-Host | Select-Object Version
	
ps-show-disks:
	Get-CimInstance -query "SELECT * from Win32_DiskDrive"
	
ps-show-env:
	dir env:

Ubuntu / WSL2 环境

# ~/.bashrc
alias j='just --justfile ~/justfile --working-directory .'
# ~/justfile

# sh/bash/dash/... is for different Linux
set shell := ["bash", "-c"]

help:
	@echo "Shell=$0; Dir=`pwd`; Using ~/justfile"
	@just --justfile ~/justfile --list

view-aosp-build-log:
	gzip -cd out/verbose.log.gz | less -R

tar destfile srcdir:
	tar -cvf {{destfile}} -C {{srcdir}} .

tar-gz destfile srcdir:
	tar -cvzf {{destfile}} -C {{srcdir}} .
Top