#!/usr/bin/env bash
# pyreg.sh: registry-style store in pure bash.
#
# Here the directory tree IS the registry: keys are directories under
# ~/pyreg/ and values are files, so ls/cat/grep work on it directly.
#
# Usage:
# pyreg.sh set <key> <name> <value>
# pyreg.sh setfile <key> <name> <file>
# pyreg.sh get <key> <name>
# pyreg.sh run <key> <name> run a stored script (.py .pl .sh)
# pyreg.sh list
set -euo pipefail
ROOT="${PYREG_ROOT:-$HOME/pyreg}"
die() { echo "$*" >&2; exit 1; }
# HKEY_CURRENT_USER\Software\App -> $ROOT/HKEY_CURRENT_USER/Software/App
key_dir() {
local key="${1//\\//}" part out="$ROOT"
local IFS=/
for part in $key; do
[[ -z "$part" ]] && continue
[[ "$part" == "." || "$part" == ".." ]] && die "invalid key"
out+="/$part"
done
printf '%s' "$out"
}
value_path() {
[[ "$2" == */* || "$2" == "." || "$2" == ".." || -z "$2" ]] && die "invalid value name"
printf '%s/%s' "$(key_dir "$1")" "$2"
}
cmd="${1:-}"
[[ -z "$cmd" ]] && { sed -n '2,13p' "$0" | sed 's/^# \{0,1\}//'; exit 0; }
shift
case "$cmd" in
set)
[[ $# -eq 3 ]] || die "usage: set <key> <name> <value>"
p="$(value_path "$1" "$2")"
mkdir -p "$(dirname "$p")"
printf '%s' "$3" > "$p"
[[ "$2" =~ \.(py|pl|sh)$ ]] && chmod 755 "$p"
echo "stored $p"
;;
setfile)
[[ $# -eq 3 ]] || die "usage: setfile <key> <name> <file>"
[[ -r "$3" ]] || die "cannot read $3"
p="$(value_path "$1" "$2")"
mkdir -p "$(dirname "$p")"
cp "$3" "$p"
[[ "$2" =~ \.(py|pl|sh)$ ]] && chmod 755 "$p"
echo "stored $p"
;;
get)
[[ $# -eq 2 ]] || die "usage: get <key> <name>"
p="$(value_path "$1" "$2")"
[[ -f "$p" ]] && cat "$p" || true
echo
;;
run)
[[ $# -eq 2 ]] || die "usage: run <key> <name>"
p="$(value_path "$1" "$2")"
[[ -f "$p" ]] || die "no such value"
case "$2" in
*.py) exec python3 "$p" ;;
*.pl) exec perl "$p" ;;
*.sh) exec bash "$p" ;;
*) die "don't know how to run '$2'" ;;
esac
;;
list)
[[ -d "$ROOT" ]] || exit 0
(cd "$ROOT" && find . -type f | sed 's|^\./||' | sort)
;;
*)
die "unknown command '$cmd'"
;;
esac
No comments:
Post a Comment
no thanks
Note: Only a member of this blog may post a comment.