How to pass command line arguments in Mac Application

5,937

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:
5,937

Related videos on Youtube

Jeremy W
Author by

Jeremy W

I live in fear of the giant 'S'...

Updated on September 18, 2022

Comments

  • Jeremy W
    Jeremy W almost 2 years

    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.
    
    • Apache
      Apache about 12 years
      I don't think you need the "--" part. Just start your app with: "./application argument"
  • Scott - Слава Україні
    Scott - Слава Україні over 7 years
    (1) What do you mean, “argc will always hold the value of 1.”? argc is the argument count; if there are five arguments (counting argv[0]), argc should be 5. You said it yourself: “argc only holds the length of the argv array.” (thus contradicting your first sentence).  (2) Arrays in C (and related languages) begin at 0, so if the argv array has argc elements, then the last one is number argc-1. … (Cont’d)
  • Scott - Слава Україні
    Scott - Слава Україні over 7 years
    (Cont’d) …  By telling the OP to run his loop while i<=argc, you are guaranteeing that i will eventually become equal to argc, so argv[i] will be accessing the array out of bounds.  (3) What do you mean, “After the first loop, the program ends and displays the correct output.”?  (4) Please don’t say, “so in your case I would write:” and then repeat the OP’s entire program with two tiny, one-character changes without stating what the changes are — it’s very hard to see them.