Как передать аргументы командной строки в приложении Mac

3713
Rohan

Я создал приложение инструмента командной строки (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. 
2
Я не думаю, что вам нужна часть "-". Просто запустите ваше приложение с помощью: "./application аргумент" Shiki 12 лет назад 0

3 ответа на вопрос

2
Daniel Beck

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

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

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

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

Подумайте, обычный 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
user2539271

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  } 
(1) Что вы имеете в виду, «argc» всегда будет иметь значение 1 »? argc - количество аргументов; если есть пять аргументов (считая `argv [0]`), `argc` должно быть 5. Вы сказали это сами:“ `argc` содержит только длину массива` argv`. ”(что противоречит вашему первому предложению) , (2) Массивы в C (и связанных языках) начинаются с 0, поэтому, если массив `argv` имеет элементы` argc`, то последним является номер `argc-1`. … (Продолжение) Scott 7 лет назад 0
(Продолжение)… Говоря OP, чтобы он запускал свой цикл, пока `i <= argc`, вы гарантируете, что` i` в конечном итоге станет равным `argc`, поэтому` argv [i] `будет обращаться к массиву за границами. (3) Что вы имеете в виду: «После первого цикла программа заканчивается и отображает правильный вывод».? (4) Пожалуйста, не говорите «так что в вашем случае я бы написал:», а затем повторите всю программу ОП с двумя крошечными односимвольными изменениями, не указав, что это за изменения - их очень трудно увидеть. Scott 7 лет назад 0