So übergeben Sie Befehlszeilenargumente in der Mac-Anwendung

3772
Rohan

Ich habe eine Befehlszeilen-Anwendung (Xocde -> Neue App -> Befehlszeilen-Tool) erstellt, die problemlos ausgeführt werden kann. Jetzt möchte ich es durch terminal laufen lassen und einige Kommandozeilenargumente übergeben, etwa so:

int main(int argc, const char * argv[]) { std::cout << "got "<<argc<<" arguments"; for ( int i = 0; i<argc;i++){ std::cout << "argument:"<<i<<"= "<<argv[i]; } //// some other piece of code  } 

Wenn ich das Terminal eingebe:

open VisiMacXsltConverter --args fdafsdfasf 

Ich erhalte folgende Ausgabe:

bekam 1 Argumentargument: 0 = / Applications / VisiMacXsltConverte

Ich möchte wissen, wie die Argumente über die Befehlszeile richtig übergeben werden.

Wenn ich es versuchte

open AppName --rwqrw open: unrecognized option `--rwqrw' Usage: open [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-b <bundle identifier>] [-a <application>] [filenames] [--args arguments] Help: Open opens files from a shell. By default, opens each file using the default application for that file.  If the file is in the form of a URL, the file will be opened as a URL. Options:  -a Opens with the specified application. -b Opens with the specified application bundle identifier. -e Opens with TextEdit. -t Opens with default text editor. -f Reads input from standard input and opens with TextEdit. -F --fresh Launches the app fresh, that is, without restoring windows. Saved persistent state is lost, excluding Untitled documents. -R, --reveal Selects in the Finder instead of opening. -W, --wait-apps Blocks until the used applications are closed (even if they were already running). --args All remaining arguments are passed in argv to the application's main() function instead of opened. -n, --new Open a new instance of the application even if one is already running. -j, --hide Launches the app hidden. -g, --background Does not bring the application to the foreground. -h, --header Searches header file locations for headers matching the given filenames, and opens them. 
2
Ich denke nicht, dass Sie den "-" Teil brauchen. Starten Sie Ihre App einfach mit: "./application argument" Shiki vor 12 Jahren 0

3 Antworten auf die Frage

2
Daniel Beck

Nicht openzum Starten von Befehlszeilenanwendungen verwenden. Es soll verwendet werden, um OS X-Anwendungen auszuführen, die in Anwendungspaketen eingeschlossen sind. Launch Services erkennt Ihr Programm nicht als Anwendung, versuchen Sie es einfach auszuführen open -a VisiMacXsltConverter...

Geben Sie einfach seinen (absoluten oder relativen Pfad) an, damit nicht gesucht wird $PATH. Abhängig von Ihrem aktuellen Arbeitsverzeichnis und dem Speicherort des Programms kann natürlich Folgendes funktionieren:

./VisiMacXsltConverter a "b c" /Users/rohan/Documents/VisiMacXsltConverter/VisiMacXsltConverter a "b c" 
0
jds

Um Ihre Frage zu beantworten - nicht so sicher über Ihren Fehler:

Stellen Sie sich eine normale C / C ++ - "Hauptklasse" vor wie in:

int main() {} 

Ersetzen Sie dies einfach durch

int main(int argc, char* argv[]) {} 

Wo können Sie die Argumente mit argv [i] indizieren. Beachten Sie, dass der Aufruf der Funktion selbst ein Argument ist (argv [0]).

Ein vollständiges Beispiel (Nachricht zur Verwendung):

int main(int argc, char* argv[]){  string fileName;  if (argc < 2) { // Remind user of how to use this program cerr << "Usage: " << argv[0] << " filename" << endl; return 0; } else { fileName = argv[1]; } } 

Beachten Sie bei dieser Methode, dass Sie die Parameter nicht mit '-' in der Befehlszeile vorgeben müssen. Sie können diese Konvention optional hinzufügen, indem Sie einfach nach '-' suchen und die Zeichenfolge nur nachziehen.

-1
user2539271

argc hält immer den Wert 1. Daher wird die angezeigte Ausgabe "got 1" und dann in die Schleife fortgesetzt. Da i = 0 ist, wird im Wesentlichen der Pfad des Programms, das gerade ausgeführt wird, ausgegeben, da das argv-Array immer mit dem Pfad an Position 0 beginnt. Argc enthält nur die Länge des argv-Arrays. Nach der ersten Schleife endet das Programm und zeigt die korrekte Ausgabe an.

in Ihrem Fall würde ich schreiben:

int main(int argc, const char * argv[]) { std::cout << "got "<<argc<<" arguments"; for ( int i = 1; i<=argc;i++){ std::cout << "argument:"<<i<<"= "<<argv[i]; } //// some other piece of code  } 
(1) Was meinen Sie mit "argc" wird immer den Wert 1 halten? "argc" ist das Argument count; Wenn es fünf Argumente gibt (zählen "argv [0]"), sollte "argc" 5 sein. Sie haben es selbst gesagt: "argc" enthält nur die Länge des "argv" -Arrays. "(Dies widerspricht Ihrem ersten Satz) . (2) Arrays in C (und verwandten Sprachen) beginnen bei 0, wenn also das Array "argv" Elemente des Typs "argc" enthält, ist das letzte Array die Zahl "argc-1". … (Fortsetzung) Scott vor 7 Jahren 0
(Fortsetzung)… Indem Sie dem OP sagen, dass es seine Schleife während "i <= argc" ausführen soll, garantieren Sie, dass "i" schließlich gleich "argc" wird, sodass "argv [i]" auf das Array zugreifen wird außerhalb der Grenzen. (3) Was heißt "Nach der ersten Schleife endet das Programm und zeigt die korrekte Ausgabe an." (4) Bitte sagen Sie nicht: „In Ihrem Fall würde ich schreiben:“ und dann das gesamte Programm des OP mit zwei winzigen Änderungen von einem Zeichen wiederholen, ohne zu sagen, was die Änderungen sind - es ist sehr schwer, sie zu sehen. Scott vor 7 Jahren 0