Il problema di * nell’argomento della riga di comando

Ho scritto un programma in Java che accetta l’input tramite argomenti della riga di comando. Ricevo un input di due numeri e un operatore dalla riga di comando. Per moltiplicare due numeri, devo dare input come ad esempio 5 3 * , ma non funziona come scritto.

Perché non accetta * dalla riga di comando?

Questo perché * è un jolly di shell: ha un significato speciale per la shell, che lo espande prima di passarlo al comando (in questo caso, java ).

Dal momento che hai bisogno di un letterale * , devi scappare dalla shell. Il modo esatto di escape varia a seconda della shell, ma puoi provare:

 java ProgramName 5 3 "*" 

O:

 java ProgramName 5 3 \* 

A proposito, se vuoi sapere cosa fa la shell con * , prova a stampare il contenuto di String[] args sul tuo metodo main . Scoprirai che conterrà i nomi dei file nella tua directory.

Questo può essere utile se è necessario passare alcuni nomi di file come argomenti della riga di comando.

Guarda anche

  • Wikipedia: glob

    Ad esempio, se una directory contiene due file, a.log e b.log il comando cat *.log verrà espanso dalla shell in cat a.log b.log

  • Wikipedia: personaggio di fuga

    In Bourne shell ( sh ), i caratteri asterisco ( * ) e punto interrogativo ( ? ) Sono caratteri jolly espansi tramite globbing. Senza un carattere di escape precedente, * si espanderà ai nomi di tutti i file nella directory di lavoro che non iniziano con un punto se e solo se ci sono tali file, altrimenti * rimane non espanso. Quindi, per fare riferimento a un file chiamato "*" , alla shell deve essere detto di non interpretarlo in questo modo, precedendolo con una barra rovesciata ( \ ).

* ha un significato speciale negli interpreti di shell. Come ottenere un * letteralmente dipende da quale interprete shell stai usando. Per Bash, dovresti inserire virgolette singole attorno a *, cioè ‘*’, invece di virgolette doppie come “*”.

Prova a circondare il * con citazioni come "*" . La stella è un simbolo riservato sulla riga di comando.

Sotto MS WINDOWS non del tutto vero: “java.exe” espande silenziosamente gli argomenti della riga di comando con i caratteri jolly

  • *
  • ?
  • [Abc]

, ma solo nell’ultimo componente, quindi

 a/*/* 

non funziona come ci si potrebbe aspettare.

Ignora anche le voci “.” e “..”, ma onora altri nomi di file che iniziano con “.”.

Per evitare equivoci: se guardo la riga di comando del processo JAVA in esecuzione con PROCEXP, vedo gli argomenti non espansi!

Non ho trovato modo di aggirare questo problema. In altre parole: finché hai almeno un file o una directory nella directory corrente, “java Calc 3 * 7” NON funzionerà!

Questo è MOLTO brutto, e sembra essere sempre stato presente in tutte le versioni di JRE fino a Java 8 incluso.

Qualcuno ha un’idea di come disabilitare la brutta espansione della riga di comando di Java?

Usa le virgolette singole :

 java FooBar 5 3 '*' 

Funziona con la maggior parte delle shell popolari (inclusi bash e ksh).