Как я могу исправить ошибку недопустимого флага JAVAC?

#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 это может сработать, но в реальной ОС Unix echo "$LIB"/*.jar часть не будет работать с Windows path

3. Спасибо за предложения; Я запускаю его на виртуальной машине 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 разделяется точкой с запятой, а не двоеточием.