Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .