Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I have created a Command line tool application ( Xocde --> New App --> Command line tool) and it's running without any problems. Now i want to run it through terminal and pass some command line arguments, something like this:

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 
}

If I type in the terminal:

open VisiMacXsltConverter --args fdafsdfasf

I am getting the following output:

got 1 argumentsargument:0= /Applications/VisiMacXsltConverte

I want to know what is the correct way to pass arguments through command line.

When i tried

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.
share|improve this question
    
I don't think you need the "--" part. Just start your app with: "./application argument" –  Shiki May 17 '12 at 8:43

2 Answers 2

Don't use open to launch command-line applications. It's supposed to be used to run OS X applications that are wrapped in application bundles. Launch Services doesn't recognize your program as an application, just try to run open -a VisiMacXsltConverter...

Just specify its (absolute or relative path) so it's not searched in $PATH. Either of the following will work, of course depending on your current working directory and where the program is stored:

./VisiMacXsltConverter a "b c"
/Users/rohan/Documents/VisiMacXsltConverter/VisiMacXsltConverter a "b c"
share|improve this answer

To address you question - not as sure about your error:

Think a normal C/C++ "main" class as in:

int main() {}

simply replace this with

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

Where you can index the arguments by argv[i]. Note that the call to the function is itself an argument (argv[0]);

A Full Example (Will Usage Message):

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];
}
}

Note with this method you do not need to preface parameters with '-' on command line. You could optionally add that convention by just looking for '-' and just taking the string after it.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.