A questão do * no argumento da linha de comando

Eu escrevi um programa em Java que aceita input via argumentos de linha de comando. Eu recebo uma input de dois números e um operador da linha de comando. Para multiplicar dois números, tenho que dar input como, por exemplo, 5 3 * , mas não está funcionando como está escrito.

Por que não está aceitando * da linha de comando?

    Isso porque * é um caractere curinga do shell: ele tem um significado especial para o shell, que o expande antes de passá-lo para o comando (neste caso, java ).

    Desde que você precisa de um literal * , você precisa escaping do shell. A maneira exata de escaping varia de acordo com o seu shell, mas você pode tentar:

     java ProgramName 5 3 "*" 

    Ou:

     java ProgramName 5 3 \* 

    By the way, se você quiser saber o que o shell faz com o * , tente imprimir o conteúdo de String[] args para o seu método main . Você verá que ele conterá nomes dos arquivos em seu diretório.

    Isso pode ser útil se você precisar passar alguns nomes de arquivos como argumentos de linha de comando.

    Veja também

    • Wikipedia: glob

      Por exemplo, se um diretório contiver dois arquivos, a.log e b.log , o comando cat *.log será expandido pelo shell para cat a.log b.log

    • Wikipedia: personagem de fuga

      Em Bourne shell ( sh ), os caracteres de asterisco ( * ) e de ponto de interrogação ( ? ) São caracteres curinga expandidos por globbing. Sem um caractere de escape precedente, um * irá se expandir para os nomes de todos os arquivos no diretório de trabalho que não iniciam com um período se, e somente se, houver tais arquivos, caso contrário * permanece não-expandido. Portanto, para se referir a um arquivo literalmente chamado "*" , o shell deve ser instruído a não interpretá-lo dessa maneira, precedendo-o com uma barra invertida ( \ ).

    * tem um significado especial em interpretadores de shell. Como obter um * literalmente depende do interpretador de shell que você está usando. Para o Bash, você deve colocar aspas simples em torno do *, ou seja, ‘*’, em vez de aspas duplas como “*”.

    Tente cercar o * com aspas como "*" . A estrela é um símbolo reservado na linha de comando.

    Em MS WINDOWS não é bem verdade: “java.exe” expande silenciosamente os argumentos da linha de comando com os curingas

    • *
    • ?
    • [abc]

    , mas apenas no último componente, então

     a/*/* 

    não funciona como você pode esperar.

    Ele também ignora as inputs “.” e “..”, mas homenageia outros nomes de arquivos que começam com “.”.

    Para evitar mal-entendidos: Se eu olhar para a linha de comando do processo JAVA em execução com o PROCEXP, vejo os argumentos não expandidos !

    Não encontrei maneira de contornar isso. Em outras palavras: Contanto que você tenha pelo menos um arquivo ou diretório no diretório atual, “java Calc 3 * 7” NÃO funcionará!

    Isso é muito feio, e parece sempre ter estado lá em todas as versões do JRE até e incluindo o Java 8.

    Alguém tem uma idéia de como desabilitar a desagradável expansão da linha de comando do Java?

    Use aspas simples :

     java FooBar 5 3 '*' 

    Isso funciona com a maioria dos shells populares (incluindo bash e ksh).