snipets

我在不同系统上使用的不同 shell 的小脚本记录。

虽然 AI 时代这些 snipets 可能已经变得一文不值,但我还是想纪念一下。

gfixup

我最常用的脚本,没有之一。将当前的 git 已追踪修改“吸收”到任意 commit(默认为最近的 commit,即 HEAD)。

sh
set -euxo pipefail
commit_hash="${1:-HEAD}"
git commit -a --fixup "$commit_hash"

if [ "$commit_hash" = "HEAD" ]; then
  rebase_target="HEAD~2"
else
  rebase_target="${commit_hash}~1"
fi
GIT_SEQUENCE_EDITOR=: git rebase -i --autosquash --committer-date-is-author-date "$rebase_target"
fish
set commit_hash $argv[1]
if test -z "$commit_hash"
    set commit_hash 'HEAD'
end
git commit -a --fixup $commit_hash
set rebase_target ""
if test $commit_hash = 'HEAD'
    set rebase_target 'HEAD~2'
else
    set rebase_target (string trim -- "$commit_hash")~1
end
GIT_SEQUENCE_EDITOR=: git rebase -i --autosquash --committer-date-is-author-date $rebase_target

revertversion

将当前 git 仓库指定 tag 移动到 HEAD(本地 + remote)。主要是我有一堆 action 是 tag 触发的,有时候代码有瑕疵,修完以后需要 rerun,就用这个脚本。

用法:rv <tag>,rv 是 revertversion 的 alias

sh
if [ $# -ne 1 ]; then
  echo "Usage: revertversion <version>"
  return 1
fi
echo "Reverting version $@"
git push origin :refs/tags/$@
git tag -d $@
git tag $@
git push --tags
nushell
def rv [version: string] {
    echo $"Reverting version $version ..."
    git push origin $":refs/tags/($version)"
    git tag -d $version
    git tag $version
    git push --tags
}

repeat

重复执行一条命令多次,主要用于暴力测试。它帮我发现了一些运行上千次才会崩溃一次的 bug。

用法:repeat <...>

record

unix only

record 本质上只算是 script 的一个 alias,用于保存输出到日志。1. record 指令不会影响终端本身输出,并且可以附加一份到日志;2. 如果有一些程序输出不是通过 stdout 或 stderr 的,record 也可以记录下来。

sh
cmd=$(printf '%q ' "$@")
script -q -c "$cmd" test.log

audiofmt

将任意格式的音频转为固定大小(默认 5MB)的 opus 音频,选择 opus 是因为该格式拥有优秀的压缩比,详见音频处理。主要用于无损格式音频的有损压缩,依赖 ffmpeg。

使用方法:audiofmt <input_file> [size(MB)]

make_new_subvolume

早期脚本,用于将文件夹转换为 btrfs subvolume,已不再使用

fish
set dir $argv
sudo mv $dir{,.bak}
sudo btrfs subvolume create $dir
sudo cp --archive --one-file-system --reflink=always $dir{.bak/*,}
sudo rm -r --one-file-system $dir'.bak'