El problema del argumento * en la línea de comando

Escribí un progtwig en Java que acepta la entrada a través de argumentos de línea de comando. Obtengo una entrada de dos números y un operador desde la línea de comando. Para multiplicar dos números, tengo que dar entrada como, por ejemplo, 5 3 * , pero no funciona como está escrito.

¿Por qué no acepta * desde la línea de comando?

Eso es porque * es un comodín de shell: tiene un significado especial para el shell, que lo expande antes de pasarlo al comando (en este caso, java ).

Como necesita un literal * , necesita escapar del caparazón. La forma exacta de escapar varía según tu caparazón, pero puedes intentar:

 java ProgramName 5 3 "*" 

O:

 java ProgramName 5 3 \* 

Por cierto, si quiere saber qué hace el shell con * , intente imprimir el contenido de String[] args en su método main . Descubrirá que contendrá los nombres de los archivos en su directorio.

Esto puede ser útil si necesita pasar algunos nombres de archivos como argumentos de línea de comando.

Ver también

  • Wikipedia: glob

    Por ejemplo, si un directorio contiene dos archivos, a.log y b.log entonces el comando cat *.log se expandirá por el shell a cat a.log b.log

  • Wikipedia: personaje de escape

    En Bourne shell ( sh ), los caracteres asterisco ( * ) y signo de interrogación ( ? ) Son caracteres comodín expandidos mediante globbing. Sin un carácter de escape precedente, un * se ampliará a los nombres de todos los archivos en el directorio de trabajo que no comiencen con un período si y solo si hay tales archivos, de lo contrario * permanece sin expandir. Entonces, para referirse a un archivo literalmente llamado "*" , se le debe decir al intérprete que no lo interprete de esta manera, precediéndolo con una barra invertida ( \ ).

* tiene un significado especial en los intérpretes de shell. Cómo obtener un * literalmente depende de qué intérprete de intérprete de comandos esté utilizando. Para Bash, debe poner comillas simples alrededor del *, es decir, “*”, en lugar de comillas dobles como “*”.

Intente rodear el * con comillas como "*" . La estrella es un símbolo reservado en la línea de comando.

En MS WINDOWS no es del todo cierto: “java.exe” expande silenciosamente los argumentos de la línea de comando con los comodines

  • *
  • ?
  • [a B C]

, pero solo en el último componente, por lo

 a/*/* 

no funciona como puede esperar

También ignora las entradas “.” y “..”, pero cumple otros nombres de archivo que comienzan con “.”.

Para evitar malentendidos: ¡Si miro la línea de comandos del proceso JAVA en ejecución con PROCEXP, veo los argumentos no expandidos !

No encontré ninguna forma de evitar esto. En otras palabras: ¡Siempre y cuando tenga al menos un archivo o directorio en el directorio actual, “java Calc 3 * 7” NO funcionará!

Esto es MUY feo, y parece haber estado siempre allí en todas las versiones de JRE hasta e incluyendo Java 8.

¿Alguien tiene una idea de cómo desactivar la desagradable expansión de línea de comandos de Java?

Use comillas simples :

 java FooBar 5 3 '*' 

Esto funciona con la mayoría de las conchas populares (incluidos bash y ksh).