Вопрос-ответ

The issue of * in Command line argument

Проблема с * в аргументе командной строки

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

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

Переведено автоматически
Ответ 1

Это потому, что * это подстановочный знак оболочки: он имеет особое значение для оболочки, которая расширяет его перед передачей команде (в данном случае, java).

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

java ProgramName 5 3 "*"

Или:

java ProgramName 5 3 \*

Кстати, если вы хотите знать, что оболочка делает с *, попробуйте распечатать содержимое String[] args в вашем main методе. Вы обнаружите, что он будет содержать имена файлов в вашем каталоге.

Это может быть удобно, если вам нужно передать некоторые имена файлов в качестве аргументов командной строки.

Смотрите также


  • Википедия: глобус



    Например, если каталог содержит два файла, a.log и b.log тогда команда cat *.log будет расширена командной оболочкой до cat a.log b.log



  • Википедия: Escape-символ



    В Bourne shell (sh) символы звездочки (*) и вопросительного знака (?) являются подстановочными знаками, расширяемыми с помощью глобулирования. Без предшествующего управляющего символа an * будет расширяться до имен всех файлов в рабочем каталоге, которые не начинаются с точки, тогда и только тогда, когда такие файлы есть, в противном случае * останется нерасширенным. Таким образом, чтобы ссылаться на файл с буквальным названием "*", оболочке необходимо указать, чтобы она не интерпретировала его таким образом, поставив перед ним обратную косую черту (\).



Ответ 2

В MS WINDOWS не совсем верно: "java.exe" автоматически расширяет аргументы командной строки с помощью подстановочных знаков


  • *

  • ?

  • [abc]

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

a/*/*

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

java