Como passar argumentos de linha de comando no aplicativo Mac

2

Eu criei um aplicativo de ferramenta de linha de comando (Xocde - > Novo aplicativo - > Ferramenta de linha de comando) e ele está em execução sem problemas. Agora eu quero executá-lo através do terminal e passar alguns argumentos de linha de comando, algo assim:

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 
}

Se eu digitar no terminal:

open VisiMacXsltConverter --args fdafsdfasf

Estou recebendo a seguinte saída:

got 1 argumentsargument:0= /Applications/VisiMacXsltConverte

Eu quero saber qual é a maneira correta de passar argumentos através da linha de comando.

Quando eu tentei

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.
    
por Rohan 17.05.2012 / 10:35

3 respostas

2

Não use open para iniciar aplicativos de linha de comando. Ele deve ser usado para executar aplicativos do OS X envolvidos em pacotes de aplicativos. O Launch Services não reconhece seu programa como um aplicativo, apenas tente executar open -a VisiMacXsltConverter ...

Basta especificar seu caminho absoluto ou relativo para que não seja pesquisado em $PATH . Qualquer um dos seguintes itens funcionará, é claro, dependendo do seu diretório de trabalho atual e onde o programa está armazenado:

./VisiMacXsltConverter a "b c"
/Users/rohan/Documents/VisiMacXsltConverter/VisiMacXsltConverter a "b c"
    
por 17.05.2012 / 10:53
0

Para responder a sua dúvida, não tão certo quanto ao seu erro:

Pense em uma classe "principal" C / C ++ normal como em:

int main() {}

simplesmente substitua isso por

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

Onde você pode indexar os argumentos por argv [i]. Note que a chamada para a função é em si um argumento (argv [0]);

Um exemplo completo (mensagem de uso):

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 que com este método você não precisa prefaciar parâmetros com '-' na linha de comando. Você poderia, opcionalmente, adicionar essa convenção apenas procurando '-' e apenas pegando a string depois dela.

    
por 22.05.2012 / 03:15
-1

argc sempre manterá o valor de 1. É por isso que a saída exibida é "tem 1" e depois continua no loop. Essencialmente, desde i = 0, ele imprimirá o caminho do programa que está sendo executado, porque o array argv sempre começa com o caminho na posição 0. argc só mantém o comprimento do array argv. Após o primeiro loop, o programa termina e exibe a saída correta.

então, no seu caso, eu escreveria:

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 
}
    
por 03.02.2017 / 12:09