penguin/utils

my env utils

commit 27864ca435ffccf5a396158b3a22d101824c354e

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-06-26T11:19:07Z
subjectDo not use \u
commit 27864ca435ffccf5a396158b3a22d101824c354e
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-06-26T11:19:07Z

    Do not use \u
---
 bash/core/50_upgrade.bash    |  49 ++++++---------------
 bash/core/80_public_api.bash |  28 ++++++++++++
 bash/rbashrc                 | 102 +++++++++++++++++++++----------------------
 bash/rbashrc.in              |  21 +++------
 4 files changed, 95 insertions(+), 105 deletions(-)

diff --git a/bash/core/50_upgrade.bash b/bash/core/50_upgrade.bash
index c7aed09..bd8b30a 100755
--- a/bash/core/50_upgrade.bash
+++ b/bash/core/50_upgrade.bash
@@ -1,55 +1,34 @@
 rbash-upgrade() {
-  local target url tmp rendered backup
-  local host domain color content
+  local target url tmp backup
 
   target="$__RBASH_SCRIPT"
   url="$(rbash_url "rbashrc")"
 
-  host="${1:-$RHOSTNAME}"
-  domain="${2:-$RDOMAIN}"
-  color="${3:-$RCOLOR}"
-
   echo "Updating $target"
 
   tmp="$(mktemp "${TMPDIR:-/tmp}/rbashrc.download.XXXXXX")" || return 1
-  rendered="$(mktemp "${TMPDIR:-/tmp}/rbashrc.rendered.XXXXXX")" || {
-    rm -f "$tmp"
-    return 1
-  }
 
   if ! rbash_download "$url" > "$tmp"; then
     echo "rbash: upgrade download failed: $url" >&2
-    rm -f "$tmp" "$rendered"
+    rm -f "$tmp"
     return 1
   fi
 
   if [ ! -s "$tmp" ]; then
     echo "rbash: downloaded rbashrc is empty; refusing to install" >&2
-    rm -f "$tmp" "$rendered"
+    rm -f "$tmp"
     return 1
   fi
 
-  content="$(cat "$tmp")"
-
-  content="${content//<HOSTNAME>/$host}"
-  content="${content//<DOMAIN>/$domain}"
-  content="${content//<RCOLOR>/$color}"
-
-  printf '%s\n' "$content" > "$rendered" || {
-    echo "rbash: failed to render new rbashrc" >&2
-    rm -f "$tmp" "$rendered"
-    return 1
-  }
-
-  if ! grep -q 'RBASH_HOME' "$rendered"; then
-    echo "rbash: rendered file does not look like rbashrc; refusing to install" >&2
-    rm -f "$tmp" "$rendered"
+  if ! grep -q 'RBASH_HOME' "$tmp"; then
+    echo "rbash: downloaded file does not look like rbashrc; refusing to install" >&2
+    rm -f "$tmp"
     return 1
   fi
 
-  if ! bash -n "$rendered"; then
-    echo "rbash: rendered rbashrc has syntax errors; refusing to install" >&2
-    rm -f "$tmp" "$rendered"
+  if ! bash -n "$tmp"; then
+    echo "rbash: downloaded rbashrc has syntax errors; refusing to install" >&2
+    rm -f "$tmp"
     return 1
   fi
 
@@ -58,23 +37,21 @@ rbash-upgrade() {
   if [ -f "$target" ]; then
     cp "$target" "$backup" || {
       echo "rbash: failed to create backup: $backup" >&2
-      rm -f "$tmp" "$rendered"
+      rm -f "$tmp"
       return 1
     }
     echo "Backup: $backup"
   fi
 
-  chmod 700 "$rendered"
+  chmod 700 "$tmp"
 
-  if ! mv "$rendered" "$target"; then
+  if ! mv "$tmp" "$target"; then
     echo "rbash: failed to replace $target" >&2
     echo "rbash: backup remains at $backup" >&2
-    rm -f "$tmp" "$rendered"
+    rm -f "$tmp"
     return 1
   fi
 
-  rm -f "$tmp"
-
   rm -rf "$RBASH_CACHE_DIR"
   mkdir -p "$RBASH_CACHE_DIR"
 
diff --git a/bash/core/80_public_api.bash b/bash/core/80_public_api.bash
new file mode 100755
index 0000000..ec71db6
--- /dev/null
+++ b/bash/core/80_public_api.bash
@@ -0,0 +1,28 @@
+rbash-host() {
+  local host="${1:-}"
+  local domain="${2:-}"
+  local color="${3:-}"
+
+  if [ -z "$host" ] || [ -z "$domain" ]; then
+    echo "Usage: rbash-host HOST DOMAIN [COLOR]" >&2
+    echo "Example: rbash-host penguin @macstudio 6" >&2
+    return 1
+  fi
+
+  mkdir -p "$RBASH_HOME"
+
+  {
+    printf 'RHOSTNAME=%q\n' "$host"
+    printf 'RDOMAIN=%q\n' "$domain"
+    if [ -n "$color" ]; then
+      printf 'RCOLOR=%q\n' "$color"
+    fi
+  } > "$RBASH_ENV"
+
+  echo "Wrote $RBASH_ENV"
+
+  # shellcheck source=/dev/null
+  source "$RBASH_ENV"
+
+  __rbash_setup_prompt
+}
\ No newline at end of file
diff --git a/bash/rbashrc b/bash/rbashrc
index a0caa2d..0ac8266 100755
--- a/bash/rbashrc
+++ b/bash/rbashrc
@@ -1,31 +1,19 @@
-#!/usr/bin/env bash
-
-# Generated from bash/rbashrc.in + bash/core/*.
-# Do not edit bash/rbashrc directly.
-
-case $- in
-  *i*) ;;
-  *) return ;;
-esac
-
-__RBASH_SCRIPT="${BASH_SOURCE[0]}"
-
 RBASH_HOME="${RBASH_HOME:-$HOME/.rbash}"
+
 RBASH_REMOTE="${RBASH_REMOTE:-https://sgit.k8s.astropenguin.net}"
 RBASH_REPO="${RBASH_REPO:-penguin/utils}"
 RBASH_REF="${RBASH_REF:-master}"
 RBASH_PATH="${RBASH_PATH:-bash}"
 
-RBASH_CACHE_DIR="$RBASH_HOME/sources"
+RBASH_CACHE_DIR="$RBASH_HOME/cache"
 RBASH_CONFIG="$RBASH_HOME/config"
 RBASH_ENV="$RBASH_HOME/env"
 RBASH_MERGED="$RBASH_CACHE_DIR/merged"
 RBASH_BIN="$RBASH_HOME/bin"
 
-RHOSTNAME="<HOSTNAME>"
-RDOMAIN="<DOMAIN>"
-RCOLOR="<RCOLOR>"
-
+RHOSTNAME="${RHOSTNAME:-\\u}"
+RDOMAIN="${RDOMAIN:-@$(hostname -s)}"
+RCOLOR="${RCOLOR:-6}"
 
 # ---- rbash: bash/core/00_env.bash ----
 
@@ -377,57 +365,36 @@ r2dissource() {
 # ---- rbash: bash/core/50_upgrade.bash ----
 
 rbash-upgrade() {
-  local target url tmp rendered backup
-  local host domain color content
+  local target url tmp backup
 
   target="$__RBASH_SCRIPT"
   url="$(rbash_url "rbashrc")"
 
-  host="${1:-$RHOSTNAME}"
-  domain="${2:-$RDOMAIN}"
-  color="${3:-$RCOLOR}"
-
   echo "Updating $target"
 
   tmp="$(mktemp "${TMPDIR:-/tmp}/rbashrc.download.XXXXXX")" || return 1
-  rendered="$(mktemp "${TMPDIR:-/tmp}/rbashrc.rendered.XXXXXX")" || {
-    rm -f "$tmp"
-    return 1
-  }
 
   if ! rbash_download "$url" > "$tmp"; then
     echo "rbash: upgrade download failed: $url" >&2
-    rm -f "$tmp" "$rendered"
+    rm -f "$tmp"
     return 1
   fi
 
   if [ ! -s "$tmp" ]; then
     echo "rbash: downloaded rbashrc is empty; refusing to install" >&2
-    rm -f "$tmp" "$rendered"
+    rm -f "$tmp"
     return 1
   fi
 
-  content="$(cat "$tmp")"
-
-  content="${content//<HOSTNAME>/$host}"
-  content="${content//<DOMAIN>/$domain}"
-  content="${content//<RCOLOR>/$color}"
-
-  printf '%s\n' "$content" > "$rendered" || {
-    echo "rbash: failed to render new rbashrc" >&2
-    rm -f "$tmp" "$rendered"
-    return 1
-  }
-
-  if ! grep -q 'RBASH_HOME' "$rendered"; then
-    echo "rbash: rendered file does not look like rbashrc; refusing to install" >&2
-    rm -f "$tmp" "$rendered"
+  if ! grep -q 'RBASH_HOME' "$tmp"; then
+    echo "rbash: downloaded file does not look like rbashrc; refusing to install" >&2
+    rm -f "$tmp"
     return 1
   fi
 
-  if ! bash -n "$rendered"; then
-    echo "rbash: rendered rbashrc has syntax errors; refusing to install" >&2
-    rm -f "$tmp" "$rendered"
+  if ! bash -n "$tmp"; then
+    echo "rbash: downloaded rbashrc has syntax errors; refusing to install" >&2
+    rm -f "$tmp"
     return 1
   fi
 
@@ -436,23 +403,21 @@ rbash-upgrade() {
   if [ -f "$target" ]; then
     cp "$target" "$backup" || {
       echo "rbash: failed to create backup: $backup" >&2
-      rm -f "$tmp" "$rendered"
+      rm -f "$tmp"
       return 1
     }
     echo "Backup: $backup"
   fi
 
-  chmod 700 "$rendered"
+  chmod 700 "$tmp"
 
-  if ! mv "$rendered" "$target"; then
+  if ! mv "$tmp" "$target"; then
     echo "rbash: failed to replace $target" >&2
     echo "rbash: backup remains at $backup" >&2
-    rm -f "$tmp" "$rendered"
+    rm -f "$tmp"
     return 1
   fi
 
-  rm -f "$tmp"
-
   rm -rf "$RBASH_CACHE_DIR"
   mkdir -p "$RBASH_CACHE_DIR"
 
@@ -460,6 +425,37 @@ rbash-upgrade() {
   source "$target"
 }
 
+# ---- rbash: bash/core/80_public_api.bash ----
+
+rbash-host() {
+  local host="${1:-}"
+  local domain="${2:-}"
+  local color="${3:-}"
+
+  if [ -z "$host" ] || [ -z "$domain" ]; then
+    echo "Usage: rbash-host HOST DOMAIN [COLOR]" >&2
+    echo "Example: rbash-host penguin @macstudio 6" >&2
+    return 1
+  fi
+
+  mkdir -p "$RBASH_HOME"
+
+  {
+    printf 'RHOSTNAME=%q\n' "$host"
+    printf 'RDOMAIN=%q\n' "$domain"
+    if [ -n "$color" ]; then
+      printf 'RCOLOR=%q\n' "$color"
+    fi
+  } > "$RBASH_ENV"
+
+  echo "Wrote $RBASH_ENV"
+
+  # shellcheck source=/dev/null
+  source "$RBASH_ENV"
+
+  __rbash_setup_prompt
+}
+
 # ---- rbash: bash/core/90_prompt.bash ----
 
 __rbash_setup_prompt() {
diff --git a/bash/rbashrc.in b/bash/rbashrc.in
index 26f87b9..9623687 100644
--- a/bash/rbashrc.in
+++ b/bash/rbashrc.in
@@ -1,27 +1,16 @@
-#!/usr/bin/env bash
-
-# Generated from bash/rbashrc.in + bash/core/*.
-# Do not edit bash/rbashrc directly.
-
-case $- in
-  *i*) ;;
-  *) return ;;
-esac
-
-__RBASH_SCRIPT="${BASH_SOURCE[0]}"
-
 RBASH_HOME="${RBASH_HOME:-$HOME/.rbash}"
+
 RBASH_REMOTE="${RBASH_REMOTE:-https://sgit.k8s.astropenguin.net}"
 RBASH_REPO="${RBASH_REPO:-penguin/utils}"
 RBASH_REF="${RBASH_REF:-master}"
 RBASH_PATH="${RBASH_PATH:-bash}"
 
-RBASH_CACHE_DIR="$RBASH_HOME/sources"
+RBASH_CACHE_DIR="$RBASH_HOME/cache"
 RBASH_CONFIG="$RBASH_HOME/config"
 RBASH_ENV="$RBASH_HOME/env"
 RBASH_MERGED="$RBASH_CACHE_DIR/merged"
 RBASH_BIN="$RBASH_HOME/bin"
 
-RHOSTNAME="<HOSTNAME>"
-RDOMAIN="<DOMAIN>"
-RCOLOR="<RCOLOR>"
+RHOSTNAME="${RHOSTNAME:-\\u}"
+RDOMAIN="${RDOMAIN:-@$(hostname -s)}"
+RCOLOR="${RCOLOR:-6}"
\ No newline at end of file