From b58965dc2361d7f9de6692d7e2c5015669d84a7e Mon Sep 17 00:00:00 2001 From: Roman Zhuravlev Date: Sun, 3 Aug 2025 22:00:49 +0500 Subject: [PATCH] Refactor code style and add `-s` option that processing `*.in` files --- mca.sh | 97 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 70 insertions(+), 27 deletions(-) diff --git a/mca.sh b/mca.sh index 85c3bea..4cb06ba 100755 --- a/mca.sh +++ b/mca.sh @@ -4,20 +4,24 @@ set -e EXEC_NAME="$(basename -- "$0")" -options="$(getopt -n "$EXEC_NAME" -s sh -o hvfdxr -l help -l version -- "$@")" -eval set -- "$options" +USAGE="Usage: $EXEC_NAME [OPTION]... [MCA_NAME|MCA_JAR|MCA_DIR] [INPUT]..." +VERSION="mca 1.0.0" + +OPTION="$(getopt -n "$EXEC_NAME" -s sh -o hvfdxrs -l help -l version -- "$@")" +eval set -- "$OPTION" SCREEN_OPTS= REATTACH_ONLY=0 +SKIP_CONFIGURE=0 while :; do case "$1" in -h|--help) - echo "Usage: $EXEC_NAME [-fdxr] [MCA_NAME|MCA_JAR|MCA_DIR] [--] [INPUT]…" + echo "$USAGE" exit ;; -v|--version) - echo "MCA 1.0.0" + echo "$VERSION" exit ;; -f) @@ -32,6 +36,9 @@ while :; do -r) REATTACH_ONLY=1 ;; + -s) + SKIP_CONFIGURE=1 + ;; --) shift break @@ -44,7 +51,8 @@ MCA_NAME=$1 if [ -z "$MCA_NAME" ]; then MCA_DIR="$PWD" MCA_NAME="$(basename -- "$MCA_DIR")" -elif echo "$MCA_NAME" | grep -qE '^\.{,2}/' && MCA_NAME="$(readlink -f -- "$MCA_NAME")"; then +elif echo "$MCA_NAME" | grep -qE '^\.{,2}/' && \ + MCA_NAME="$(readlink -f -- "$MCA_NAME")"; then if [ -d "$MCA_NAME" ]; then MCA_DIR="$MCA_NAME" MCA_NAME="$(basename -- "$MCA_DIR")" @@ -56,45 +64,65 @@ else MCA_DIR="$HOME/mca/$MCA_NAME" fi -command -v screen > /dev/null || { echo "$EXEC_NAME: screen not found" >&2; exit 2; } +if ! command -v screen > /dev/null; then + echo "$EXEC_NAME: screen not found" >&2 + exit 2 +fi if [ -n "$2" ]; then shift INPUT="$(echo "$*" | sed 's/"/\\\0/g')" - screen -S "$MCA_NAME" -X eval "stuff \"$INPUT\"\\015" > /dev/null || { - echo "$EXEC_NAME: no screen found" >&2 + if screen -S "$MCA_NAME" -X eval "stuff \"$INPUT\"\\015" > /dev/null; then + exit 0 + else + echo "$EXEC_NAME: $MCA_NAME: no such screen found" >&2 exit 2 - } - exit + fi fi MCA_SCREENRC_FILE="/etc/mca/screenrc" -[ -r "$MCA_SCREENRC_FILE" ] || { echo "$EXEC_NAME: can't read $MCA_SCREENRC_FILE" >&2; exit 2; } +if [ ! -r "$MCA_SCREENRC_FILE" ]; then + echo "$EXEC_NAME: can't read $MCA_SCREENRC_FILE" >&2 + exit 2 +fi -if screen -c "$MCA_SCREENRC_FILE" "-$SCREEN_OPTS"rS "$MCA_NAME" > /dev/null 2>&1; then - exit +if screen -c "$MCA_SCREENRC_FILE" "-$SCREEN_OPTS"rS \ + "$MCA_NAME" > /dev/null 2>&1; then + exit 0 elif screen -S "$MCA_NAME" -X select . > /dev/null 2>&1; then echo "$EXEC_NAME: this screen has already been attached to someone" >&2 exit 2 fi -[ "$REATTACH_ONLY" -eq 1 ] && { echo "$EXEC_NAME: $MCA_NAME: no such a screen was found" >&2; exit 2; } +if [ "$REATTACH_ONLY" -eq 1 ]; then + echo "$EXEC_NAME: $MCA_NAME: no such screen found" >&2 + exit 2 +fi -[ -d "$MCA_DIR" ] || { echo "$EXEC_NAME: $MCA_DIR: not found" >&2; exit 2; } +if [ ! -d "$MCA_DIR" ]; then + echo "$EXEC_NAME: $MCA_DIR: such directory not found" >&2 + exit 2 +fi cd "$MCA_DIR" MCA_RC_FILE="$MCA_DIR/.mcarc" -# this file is taken from a dynamic variable, so we cannot specify an explicit path to the file +# this file is taken from a dynamic variable, so we cannot specify an explicit +# path to the file. # shellcheck disable=SC1090 -# `--` is supported in dash +# `--` is supported in dash. # shellcheck disable=SC2240 -[ -e "$MCA_RC_FILE" ] && . -- "$MCA_RC_FILE" +if [ -e "$MCA_RC_FILE" ]; then + set -a + . -- "$MCA_RC_FILE" + set +a +fi if [ -z "$PLATFORM" ]; then if [ -z "$MCA_JAR" ]; then - MCA_JAR="$(find "$MCA_DIR" -maxdepth 1 -type f -name \*.jar | head -1)" + MCA_JAR="$(find "$MCA_DIR" -maxdepth 1 \ + -type f -name \*.jar | head -1)" [ -z "$MCA_JAR" ] && { echo "$EXEC_NAME: no jar found in $MCA_DIR" >&2 exit 2 @@ -103,7 +131,8 @@ if [ -z "$PLATFORM" ]; then if [ -e "$MCA_JAR" ]; then PLATFORM="$(basename -- "$MCA_JAR")" - PLATFORM="$(echo "$PLATFORM" | tr '[:upper:]' '[:lower:]' | grep -oE '[a-z]+' | head -1)" + PLATFORM="$(echo "$PLATFORM" | tr '[:upper:]' '[:lower:]' | \ + grep -oE '[a-z]+' | head -1)" else echo "$EXEC_NAME: $MCA_JAR: no such file" >&2 exit 2 @@ -157,27 +186,41 @@ case "$PLATFORM" in custom) ;; *) - echo "$EXEC_NAME: invalid platform: $PLATFORM. Valid: \ -bungee, waterfall, velocity, minecraft, bukkit, craftbukkit, spigot, paper, custom" >&2 + echo "$EXEC_NAME: invalid platform: $PLATFORM. Valid: bungee, \ + waterfall, velocity, minecraft, bukkit, craftbukkit, spigot, \ + paper, custom" >&2 exit 2 ;; esac -[ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME/bin" ] && PATH="$JAVA_HOME/bin:$PATH" +if [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME/bin" ]; then + PATH="$JAVA_HOME/bin:$PATH" +fi -java -version > /dev/null 2>&1 || { +if ! command -v java > /dev/null; then echo "$EXEC_NAME: unable to get Java version (is Java installed?)" >&2 exit 2 -} +fi [ -n "$MAX_MEMORY" ] && JVM_FLAGS="-Xmx$MAX_MEMORY $JVM_FLAGS" [ -n "$MIN_MEMORY" ] && JVM_FLAGS="-Xms$MIN_MEMORY $JVM_FLAGS" MCA_CMD="$(which java) -server $JVM_FLAGS -jar $MCA_JAR" -# papermc prints uncolored text if the COLORTERM variable is set to `truecolor` +if [ "$SKIP_CONFIGURE" -eq 0 ]; then + ENV_LIST="$(cut -d= -f1 < ./.mcarc | sed 's/^/$/g'))" + FILE_LIST="$(find . -name '*.in' -type f)" + + echo "$FILE_LIST" | while read -r line; do + envsubst "$ENV_LIST" < "$line" > "${line%*.in}" + done +fi + +# papermc prints uncolored text if the COLORTERM variable is set to +# `truecolor`. export COLORTERM= -# we don't quote $MCA_CMD because screen treats arguments after the second one as a command +# we don't quote $MCA_CMD because screen treats arguments after the second one +# as a command. # shellcheck disable=SC2086 exec screen -c "$MCA_SCREENRC_FILE" "-$SCREEN_OPTS"S "$MCA_NAME" -- $MCA_CMD