Мое решение:
Поговорив с моим профессором, я нашел решение.Я хотел бы отметить новый скрипт, и какие были проблемы со старым скриптом, и что мы изменили, чтобы сделать эту работу:
#!/bin/bash
list=/Users/ajm/Desktop/170Grading/output/list.txt
score=/Users/ajm/Desktop/170Grading/output/score.txt
runs=/Users/ajm/Desktop/170Grading/runs
> "$list"
> "$score"
rm -r "$runs"/*
find "$1" -name "*$3.java" >> "$list"
exec 3< "$list"
while IFS='' read -r -u 3 line || [ -n "$line" ]
do
read -p "> $line (Press Enter to continue)"
echo "the next file is $line" >> "$score"
open -a "Xcode" "$line"
javac -d "$runs" "$line" && echo compiled >> "$score" || echo not compiled >> "$score"
class=$(basename "$line")
class=${class%.java}
cd "$runs"
echo "$2" | java -cp "$runs" ${class} >> "$score"
done
Объяснение:
список, оценка,и запускает все ссылки на пути на моем компьютере, в будущем я хотел бы сделать это решение более общим для любого компьютера.Строки:
> "$list"
> "$score"
Повторно инициализируйте эти пути, чтобы они были пустыми.Чтобы повторно инициализировать пустую папку запусков, мы используем:
rm -r "$runs"/*
, которая рекурсивно удаляет все, что находится внутри каталога запусков.Слово
Осторожно : из-за звездочки, если настройки установлены неправильно, вы можете нанести необратимый ущерб вашему компьютеру.
Код остается неизменным до тех пор, пока здесь:
class=$(basename "$line")
class=${class%.java}
На этом шаге мы берем только последний элемент в каталоге классов, а затем удаляем часть имени .class, потому что выполняется:
java code.class
на самом деле приказывает jvm сделать:
java code.class.class
и поэтому мы столкнемся с ошибками.
На последнем шаге мы используем фигурные скобки вместо кавычек {} для ссылки на имя файла:
echo "$2" | java -cp "$runs" ${class} >> "$score"
И кроме назначения $ 2 и $ 3 при выполнении в отличие от запуска скрипта, код тот же.
Я надеюсь, что если кто-то столкнется с этой проблемойв будущем этот ответ будет полезен.Я буду рефакторинг более общего сценария для этого использования, и я могу опубликовать его в качестве приложения в будущем.