Помощник преподавателя bash скрипт для автоматизации процесса поиска, компиляции и запуска файлов .java - PullRequest
0 голосов
/ 18 сентября 2018

Справочная информация:

Я разместил вопрос на https://unix.stackexchange.com/questions/469680/teaching-assistant-bash-script-to-automate-the-process-of-finding-compiling-an и получил несколько действительно полезных советов.Теперь я хотел бы сделать свой процесс еще на шаг впереди.

Краткое описание дизайна:

Я учусь в университете, желая автоматизировать тестирование Java-кода моего студента.Я также использую эту возможность, чтобы повысить свои навыки в bash, потому что я чувствую, что они могли бы быть лучше.Мой текущий скрипт bash выглядит так:

#!/bin/bash

list='/Users/ajm/Desktop/170Grading/output/list.txt'
score='/Users/ajm/Desktop/170Grading/output/score.txt'

> "$list"
> "$score"

find "$1" -name '*.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 "/Users/ajm/Desktop/170Grading/runs" "$line" >> class && echo compiled >> "$score" || echo not compiled >> "$score"

    echo "standard in string" | cd "/Users/ajm/Desktop/170Grading/runs" java "$class" >> "$score"
done

Точка разногласия

В настоящее время все работает до последней строки перед выполнением.По какой-то странной причине вывод из java "$ class" не добавляется к "$ score" .Будем весьма благодарны за любые указания.

Дополнительные цели

A) Я хотел бы иметь возможность использовать дополнительные параметры для моего сценария, чтобы мне не нужно было редактировать его для каждого сценария.новое назначение.Например, в:

find "$1" -name '*.java' >> "$list"

Я хотел бы иметь возможность заменить '*. Java' на ' string.java' .Я знаю, что могу получить строку как $ 2 в качестве аргумента команды для сценария, но ' $ 2.java' , похоже, не является правильным способом добиться этого.В качестве примера: скажем, я хочу посмотреть только на подмножество файлов .java, которые заканчивают color.java, я хотел бы иметь возможность сказать

bash script.sh directory color

и выполнить это задание.Если нет $ 2, код должен по умолчанию '*. Java' .

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Мое решение:

Поговорив с моим профессором, я нашел решение.Я хотел бы отметить новый скрипт, и какие были проблемы со старым скриптом, и что мы изменили, чтобы сделать эту работу:

#!/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 при выполнении в отличие от запуска скрипта, код тот же.

Я надеюсь, что если кто-то столкнется с этой проблемойв будущем этот ответ будет полезен.Я буду рефакторинг более общего сценария для этого использования, и я могу опубликовать его в качестве приложения в будущем.

0 голосов
/ 18 сентября 2018

Вы не выполняете Java. Вы делаете

 cd "/Users/ajm/Desktop/170Grading/runs" java "$class" >> "$score"

Команда cd видит 3 аргумента и игнорирует "java" и "$ class".

Попробуйте вместо:

cd "/Users/ajm/Desktop/170Grading/runs"
echo "standard in string" | java "$class" >> "$score"

Или, если ваша переменная среды CLASSPATH не содержит . в качестве одного из путей, вы можете явно указать путь к классу без изменения каталога:

echo "standard in string" | java -cp "/Users/ajm/Desktop/170Grading/runs" "$class" >> "$score"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...