Проблема * в аргументе командной строки
Я написал программу на Java, которая принимает входные данные через аргументы командной строки.
Я получаю ввод двух чисел и оператора из командной строки.
Чтобы умножить два числа, я должен дать ввод, например. 5 3 *
, но он не работает как написанный.
Почему он не принимает *
из командной строки?
Ответы
Ответ 1
Это потому, что *
- это подстановочный шаблон оболочки: он имеет особое значение для оболочки, которая расширяет его, прежде чем передавать его команде (в этом случае java
).
Так как вам нужен литерал *
, вам нужно вывести его из оболочки. Точный способ экранирования зависит от вашей оболочки, но вы можете попробовать:
java ProgramName 5 3 "*"
Или:
java ProgramName 5 3 \*
Кстати, если вы хотите узнать, что делает оболочка с *
, попробуйте распечатать содержимое String[] args
по вашему методу main
. Вы обнаружите, что он будет содержать имена файлов в вашем каталоге.
Это может быть удобно, если вам нужно передать некоторые имена файлов в качестве аргументов командной строки.
См. также
-
Википедия: glob
Например, если каталог содержит два файла, a.log
и b.log
, тогда команда cat *.log
будет расширена оболочкой до cat a.log b.log
-
Википедия: символ Escape
В оболочке Bourne (sh
) символы звездочки (*
) и вопросительного знака (?
) являются подстановочными символами, расширенными с помощью подстановки. Без предшествующего escape-символа *
будет расширяться до имен всех файлов в рабочем каталоге, которые не начинаются с периода, если и только если есть такие файлы, в противном случае *
остается нерасширенным. Поэтому, чтобы ссылаться на файл, буквально называемый "*"
, оболочке должно быть сказано не интерпретировать ее таким образом, предшествуя ей обратным слэшем (\
).
Ответ 2
* имеет особое значение в интерпретаторах оболочки. Как получить * буквально в зависимости от того, какой интерпретатор оболочки вы используете. Для Bash вы должны поместить одиночные кавычки вокруг *, т.е. '*', Вместо двойных кавычек, таких как "*".
Ответ 3
Попробуйте окружить *
кавычками, например "*"
. Звезда является зарезервированным символом в командной строке.
Ответ 4
В MS WINDOWS не совсем верно: "java.exe" молча расширяет аргументы командной строки с помощью подстановочных знаков
но только в последнем компоненте, поэтому
a/*/*
не работает, как вы можете ожидать.
Он также игнорирует записи ".". и "..", но выполняет другие имена файлов, начиная с ".".
Чтобы избежать недоразумений: если я посмотрю на командную строку запуска JAVA-процесса с помощью PROCEXP, я вижу аргументы нераскрытых!
Я не нашел возможности обойти это. Другими словами: до тех пор, пока у вас есть хотя бы один файл или каталог в текущем каталоге, "java Calc 3 * 7" НЕ будет работать!
Это ОЧЕНЬ уродливый и, кажется, всегда присутствовал во всех версиях JRE вплоть до Java 8.
Кто-нибудь знает, как отключить расширение командной строки Java?
Ответ 5
Используйте одинарные кавычки:
java FooBar 5 3 '*'
Это работает с большинством популярных оболочек (включая bash и ksh).