Вопрос * в аргументе командной строки - PullRequest
16 голосов
/ 27 апреля 2010

Я написал программу на Java, которая принимает ввод через аргументы командной строки. Я получаю ввод из двух чисел и оператора из командной строки. Чтобы умножить два числа, я должен дать вход, например, 5 3 *, но не так, как написано.

Почему он не принимает * из командной строки?

Ответы [ 5 ]

29 голосов
/ 27 апреля 2010

Это потому, что * является подстановочным знаком оболочки: он имеет особое значение для оболочки, которая расширяет его перед передачей в команду (в данном случае 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-символа * расширится до имен всех файлов в рабочем каталоге, которые не начинаются с точки, если и только если есть такие файлы, в противном случае * остается нерасширенным. Таким образом, чтобы сослаться на файл, буквально называемый "*", оболочке нужно сказать не интерпретировать его таким образом, поставив перед ним обратную косую черту (\).

4 голосов
/ 27 апреля 2010

* имеет особое значение в интерпретаторах оболочки. Как получить * буквально зависит от того, какой интерпретатор оболочки вы используете. Для Bash вы должны ставить одинарные кавычки вокруг *, то есть '*', вместо двойных кавычек вроде "*".

3 голосов
/ 13 июля 2015

Под MS WINDOWS не совсем верно: «java.exe» молча расширяет аргументы командной строки подстановочными знаками

  • *
  • [а]

, но только в последнем компоненте, поэтому

a/*/*

не работает так, как вы можете ожидать.

Также игнорирует записи "." и "..", но учитывает другие имена файлов, начинающиеся с ".".

Чтобы избежать недоразумений: если я посмотрю на командную строку запущенного процесса JAVA с PROCEXP, я увижу нерасширенные аргументы!

Я не нашел способа обойти это. Другими словами: если у вас есть хотя бы один файл или каталог в текущем каталоге, «java Calc 3 * 7» НЕ будет работать!

Это ОЧЕНЬ уродливо и, кажется, всегда присутствовало во всех версиях JRE вплоть до Java 8.

Кто-нибудь знает, как отключить неприятное расширение командной строки Java?

2 голосов
/ 27 апреля 2010

Попробуйте окружить * кавычками, такими как "*". Звезда является зарезервированным символом в командной строке.

1 голос
/ 26 мая 2016

Использовать одинарные кавычки :

java FooBar 5 3 '*'

Это работает с большинством популярных оболочек (включая bash и ksh).

...