Как передать аргументы командной строки в Mac Application
Я создал приложение инструмента командной строки ( 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 ответа
Не использовать open
запускать приложения командной строки. Предполагается, что он будет использоваться для запуска приложений OS X, которые упакованы в пакеты приложений. Launch Services не распознает вашу программу как приложение, просто попробуйте запустить open -a VisiMacXsltConverter
...
Просто укажите его (абсолютный или относительный путь), чтобы его не искали в $PATH
, Любое из следующего будет работать, конечно, в зависимости от вашего текущего рабочего каталога и места хранения программы:
./VisiMacXsltConverter a "b c"
/Users/rohan/Documents/VisiMacXsltConverter/VisiMacXsltConverter a "b c"
Чтобы ответить на ваш вопрос - не так уверен в вашей ошибке:
Подумайте, обычный 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];
}
}
Обратите внимание, что при использовании этого метода вам не нужно вводить параметры с помощью "-" в командной строке. При желании вы можете добавить это соглашение, просто найдя "-" и просто взяв строку после него.
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
}