18 Stimmen

Das Problem des * im Befehlszeilenargument

Ich habe ein Programm in Java geschrieben, das Eingaben über Befehlszeilenargumente entgegennimmt. Ich erhalte eine Eingabe von zwei Zahlen und einem Operator von der Kommandozeile. Um zwei Zahlen zu multiplizieren, muss ich eine Eingabe machen wie z.B. 5 3 * aber es funktioniert nicht wie geschrieben.

Warum akzeptiert sie nicht die * über die Befehlszeile?

33voto

polygenelubricants Punkte 362173

Das liegt daran, dass * ist ein Shell-Platzhalter: Er hat eine besondere Bedeutung für die Shell, die ihn erweitert, bevor sie ihn an den Befehl weitergibt (in diesem Fall, java ).

Da Sie eine wörtliche * müssen Sie es aus der Schale befreien. Die genaue Art und Weise des Entkommens variiert je nach Shell, aber Sie können es versuchen:

java ProgramName 5 3 "*"

Oder:

java ProgramName 5 3 \*

Übrigens, wenn Sie wissen wollen, was die Shell mit der * versuchen Sie, den Inhalt von String[] args zu Ihrem main Methode. Sie werden feststellen, dass sie die Namen der Dateien in Ihrem Verzeichnis enthält.

Dies kann praktisch sein, wenn Sie einige Dateinamen als Befehlszeilenargumente übergeben müssen.

Siehe auch

  • Wikipedia: glob

    Zum Beispiel, wenn ein Verzeichnis zwei Dateien enthält, a.log y b.log dann der Befehl cat *.log wird von der Shell erweitert zu cat a.log b.log

  • Wikipedia: Fluchtzeichen

    In der Bourne-Shell ( sh ), das Sternchen ( * ) und Fragezeichen ( ? ) sind Wildcard-Zeichen, die durch Globbing erweitert werden. Ohne ein vorangehendes Escape-Zeichen wird ein * expandiert zu den Namen aller Dateien im Arbeitsverzeichnis, die nicht mit einem Punkt beginnen, wenn und nur wenn es solche Dateien gibt, ansonsten * bleibt unausgefüllt. Um also auf eine Datei zu verweisen, die buchstäblich "*" muss die Shell angewiesen werden, es nicht auf diese Weise zu interpretieren, indem sie einen Backslash vorangestellt bekommt ( \ ).

5voto

Arno Unkrig Punkte 161

Unter MS Windows stimmt das nicht ganz: "java.exe" erweitert die Befehlszeilenargumente stillschweigend mit den Platzhaltern

  • *
  • ?
  • [abc]

aber nur in der letzten Komponente, also

a/*/*

funktioniert nicht so, wie Sie vielleicht erwarten.

Es ignoriert auch die Einträge "." und "..", berücksichtigt aber andere Dateinamen, die mit "." beginnen.

Um Missverständnisse zu vermeiden: Wenn ich mir die Kommandozeile des laufenden JAVA-Prozesses mit PROCEXP ansehe, sehe ich die nicht expandiert args!

Ich habe keine Möglichkeit gefunden, dieses Problem zu umgehen. Mit anderen Worten: Solange Sie mindestens eine Datei oder ein Verzeichnis im aktuellen Verzeichnis haben, wird "java Calc 3 * 7" NICHT funktionieren!

Das ist SEHR hässlich und scheint in allen JRE-Versionen bis einschließlich Java 8 immer vorhanden gewesen zu sein.

Hat jemand eine Idee, wie man die unangenehme Befehlszeilenerweiterung von Java deaktivieren kann?

4voto

Zhaojun Punkte 1149

* hat in Shell-Interpretern eine besondere Bedeutung. Wie man ein * wörtlich nimmt, hängt davon ab, welchen Shell-Interpreter man verwendet. Bei der Bash sollten Sie das * in einfache Anführungszeichen setzen, d. h. '*', statt in doppelte Anführungszeichen wie "*".

2voto

Versuchen Sie, die * mit Zitaten wie "*" . Der Stern ist ein reserviertes Symbol in der Befehlszeile.

1voto

Dávid Horváth Punkte 3744

Utilice einfache Anführungszeichen :

java FooBar 5 3 '*'

Dies funktioniert mit den meisten gängigen Shells (einschließlich bash und ksh).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X