Скрипт BASH с использованием триггеров Ent с помощью Append (>>) перенаправлениеJAVA

Программисты JAVA общаются здесь
Anonymous
Скрипт BASH с использованием триггеров Ent с помощью Append (>>) перенаправление

Сообщение Anonymous »

Я использую сценарий Bash для компиляции и запуска программы Java с перенаправлением ввода/вывода. Вот упрощенный поток:

[*] compile java -файл -> запустить его -> перенаправление ввода из io/in.txt и вывода в io/out.txt
Это может перезаписать (>) или приложение (>>), основанный на флаге конфигурации. Изменения в main.java и io/in.txt, и запустите скрипт:
command ls Main.java io/in.txt | entr -d ./run.sh Main.java

Проблема
Когда скрипт использует перенаправление приложения (>), он заметил, что он работает дважды каждый раз, когда файл меняется. Линии консоли эха напечатаны только один раз, но out.txt написан дважды. Это поведение наблюдается на macOS с использованием vScode.
script
# ----------- Configuration --------------
_R_JAVA_HOME="/opt/homebrew/Cellar/openjdk/23.0.2/libexec/openjdk.jdk/Contents/Home"
_R_IO_DIR="io"
_R_BIN_DIR=".bin"
_R_ENABLE_ASSERTIONS=true
_R_CAN_APPEND_OUTPUT=true
_R_SILENT_MODE=false
# ------------ User Config --------------
# Check if run.conf exists and source it
# This allows users to override the default settings
[ -f run.conf ] && source run.conf
# ----------------------------------------

# -------------- Colors ------------------
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
RESET='\033[0m'

print_msg() {
local color=$1; shift
local msg=$1
if [ "$_R_SILENT_MODE" = true ]; then
return
fi
echo -e "${!color}${msg}${RESET}"
}

print_error() { print_msg RED "fatal: $1"; }
print_success() { print_msg GREEN "$1"; }
print_warning() { print_msg YELLOW "warning: $1"; }
print_info() { print_msg BLUE "$1"; }
# ----------------------------------------

# CHECK :: Usage
if [ -z "$1" ]; then
print_info "usage: $0 "
exit 1
fi

# STEP :: Parse Input
java_file="$1"
class_name=$(basename "$java_file" .java)

# METHOD :: Compile
compile_java_file() {
${_R_JAVA_HOME}/bin/javac -d "$_R_BIN_DIR" "$java_file"
return $?
}

# METHOD :: Run
run_java_program() {
local cmd="${_R_JAVA_HOME}/bin/java"
[ "$_R_ENABLE_ASSERTIONS" = true ] && cmd="$cmd -ea"
cmd="$cmd -cp $_R_BIN_DIR $class_name"

local input_file="$_R_IO_DIR/in.txt"
local output_file="$_R_IO_DIR/out.txt"
local redirection=">"

[ "$_R_CAN_APPEND_OUTPUT" = true ] && redirection=">>"

eval "$cmd < \"$input_file\" $redirection \"$output_file\""
return $?
}

# STEP :: Compile
compile_java_file
if [ $? -ne 0 ]; then
print_error "compilation failed."
exit 1
fi

# STEP :: Run
run_java_program
if [ $? -ne 0 ]; then
print_error "execution failed."
exit 1
else
print_success "execution successful."
# print_info "Output written to: $_R_IO_DIR/out.txt"
fi


Подробнее здесь: https://stackoverflow.com/questions/796 ... edirection

Вернуться в «JAVA»