#bash #shell #javac
#bash #оболочка #javac
Вопрос:
Я пытаюсь скомпилировать сценарий оболочки javac
, и он продолжает возвращать мне эту ошибку:
$ bash run_RGE.sh
javac: invalid flag: Element.java
Usage: javac <options> <source files>
use -help for a list of possible options
javac: invalid flag: RGE.java
Usage: javac <options> <source files>
use -help for a list of possible options
javac: invalid flag: -Xms1024m
Usage: javac <options> <source files>
use -help for a list of possible options
sleep: missing operand
Try "sleep --help" for more information.
Мой сценарий оболочки выглядит следующим образом :
#!/bin/bash
# -*- coding: utf-8 -*-
export LIB=C:/home/b04280/Transfert/Libs/
CLASSPATH=$(echo "$LIB"/*.jar | tr ' ' ':')
export ficIn=C:/home/b04280/Transfert/rgeII.xlsx/
export repIn=C:/home/b04280/Transfert/rgeII/
export repOut=C:/home/b04280/Transfert/rgeIIcible/
javac -cp $CLASSPATH Element.java
javac -cp $CLASSPATH RGE.java
javac -Xms1024m -Xmx1024m -cp $CLASSPATH RGE $ficIn $repIn $repOut > docx.txt
sleep
Мне интересно, откуда взялась эта ошибка, я рассмотрел здесь другие вопросы, касающиеся той же темы, но их решения, похоже, не подходят для моего конкретного случая.
Любая помощь, пожалуйста? Заранее спасибо.
PS. У меня также есть ошибка сна (я «перевел» этот скрипт из batch -> shell, а «sleep» был заменой, которую я нашел для «pause»)
Комментарии:
1. Используйте
bash -x run_RGE.sh
, он покажет расширенные команды, которые он выполняет.2. Кстати, на чем вы запускаете свой скрипт bash? Если это
git bash
илиcygwin
это может сработать, но в реальной ОС Unixecho "$LIB"/*.jar
часть не будет работать с Windows path3. Спасибо за предложения; Я запускаю его на виртуальной машине Linux. В частности, Mobaxterm.
4. не знаком с инструментом, но быстрый взгляд на его документ заставляет меня думать, что он не переводит пути Windows в пути unix, как это делают Cygwin и git bash. Это означало бы «C:/home/b04280/Transfert/Libs /» не является каталогом с точки зрения вашего скрипта
5. Кроме того, каждая запись в ПУТИ к классу содержит двоеточие, но ПУТЬ к КЛАССУ разделяется двоеточием.
Ответ №1:
Я считаю, что это должно быть ближе к тому, что вам нужно :
#!/bin/bash
# -*- coding: utf-8 -*-
lib=/home/b04280/Transfert/Libs
classpath=$(echo "$lib"/*.jar | tr ' ' ':')
fic_in=/home/b04280/Transfert/rgeII.xlsx/
rep_in=/home/b04280/Transfert/rgeII/
rep_out=/home/b04280/Transfert/rgeIIcible/
javac -cp "$classpath" Element.java
javac -cp "$classpath" RGE.java
java -Xms1024m -Xmx1024m -cp "$classpath" RGE "$fic_in" "$rep_in" "$rep_out" > docx.txt
В частности :
- пути unix
- переменные в кавычках, чтобы они не анализировались как несколько аргументов, если их значения содержат пробелы
- в последней команде RGE — это имя класса, а не путь к файлу, вы указываете параметры памяти, плюс команда выдает полезный вывод; мне кажется, он должен выполнять code (
java
), а не компилировать его (javac
) - Я не уверен, что это необходимо, но удаление конечной косой черты из
$LIB
значения s позволяет избежать двойных косых$CLASSPATH
черт, которые могут сбить с толкуjava[c]
- удалены бесполезные
export
s (они были бы полезны, если бы вы вызывали другие скрипты или двоичные файлы bash, которые полагались бы на заданные эти переменные, но вы просто передаете их в качестве параметров) - применяемые соглашения об именовании (избегайте прописных переменных, поскольку они могут конфликтовать с переменными среды, используйте
snake_case
вместоcamelCase
).
Я не уверен в вашем контексте, выполняете ли вы версию java[c]
двоичных файлов Linux или Windows. Если это windows, вам нужно будет заменить tr ' ' ':'
часть на tr ' ' ';'
, поскольку путь к классу в Windows разделяется точкой с запятой, а не двоеточием.