2

Я создал приложение инструмента командной строки (Xocde -> Новое приложение -> Инструмент командной строки), и оно работает без каких-либо проблем. Теперь я хочу запустить его через терминал и передать некоторые аргументы командной строки, что-то вроде этого:

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 
}

Если я наберу в терминале:

open VisiMacXsltConverter --args fdafsdfasf

Я получаю следующий вывод:

получил 1 аргумент аргумент:0 = /Applications /VisiMacXsltConverte

Я хочу знать, как правильно передать аргументы через командную строку.

Когда я пытался

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.

3 ответа3

2

Не используйте open для запуска приложений командной строки. Предполагается, что он будет использоваться для запуска приложений OS X, которые упакованы в пакеты приложений. Службы запуска не распознают вашу программу как приложение, просто попробуйте запустить open -a VisiMacXsltConverter ...

Просто укажите его (абсолютный или относительный путь), чтобы его не искали в $PATH . Любое из следующего будет работать, конечно, в зависимости от вашего текущего рабочего каталога и места хранения программы:

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

Чтобы ответить на ваш вопрос - не так уверен в вашей ошибке:

Подумайте, обычный C/C++ "основной" класс, как в:

int main() {}

просто замените это на

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

Где вы можете индексировать аргументы с помощью argv [i]. Обратите внимание, что вызов функции сам по себе является аргументом (argv [0]);

Полный пример (сообщение об использовании):

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

Обратите внимание, что при использовании этого метода вам не нужно вводить параметры с помощью «-» в командной строке. При желании вы можете добавить это соглашение, просто посмотрев «-» и просто взяв строку после него.

-1

argc всегда будет содержать значение 1. Вот почему отображаемый вывод "получил 1", а затем продолжил цикл. По сути, так как i = 0, он выведет путь к исполняемой программе, потому что массив argv всегда начинается с пути в позиции 0. argc содержит только длину массива argv. После первого цикла программа завершается и отображает правильный вывод.

так что в вашем случае я бы написал:

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 
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .