Я использую GNOME много-много лет, так что после всех этих лет я просто могу сказать, что он мне очень нравится.

Как пользователь, у меня был отличный опыт, но как у разработчика у меня совсем нет опыта; Итак, справедливо сказать, что это моя первая попытка узнать что-то о технологиях разработчиков GNOME.

Обработка аргументов командной строки в GJS

Будучи старым школьником, я решил начать изучать, как обрабатывать аргументы командной строки в GJS. Идея состоит в том, чтобы отныне делать свои собственные скрипты на GJS вместо bash.

Итак, давайте начнем, первое, что вы должны знать, это то, что аргументы командной строки в GJS хранятся в var ARGV:

#!/usr/bin/gjs
// handle1.js
print(ARGV);

выполнение этого небольшого фрагмента кода показывает, как хранятся аргументы командной строки:

$ ./handling1.js --option1 --option2 -t file
--option1,--option2,-t,file

Тогда вам просто нужно разобрать ARGV и обработать каждую опцию с помощью кода… Легко, верно? Ну, это звучит скучно и сложно. Здесь в дело вступают библиотеки GNOME; Поискав в документации GObject, я обнаружил, что существует «стандартный» способ обработки аргументов командной строки с использованием GApplication (часть библиотеки GIO).

Согласно официальной документации, GApplication является основой любого приложения и предоставляет, среди прочего, средства для разбора аргументов командной строки. Важно отметить, что следующий код намного сложнее и требует от вас знания многих концепций написания приложений на GJS (если вы ничего не знаете о программировании GJS, хорошим местом для начала будет GJS wiki). Итак, вот код:

#!/usr/bin/gjs
// handling2.js
const System = imports.system;
const Gio    = imports.gi.Gio;
const GLib   = imports.gi.GLib;
const Lang   = imports.lang;
const Handling = new Lang.Class({
    Name: ‘Handling’,
    Extends: Gio.Application,
    _version: ‘0.1’,
    _init: function() {
        this.parent({ application_id: ‘handling.example.com’,
                      flags: Gio.ApplicationFlags.FLAGS_NONE });
        this.add_main_option(‘version’,
                             ‘v’.charCodeAt(0),
                             GLib.OptionFlags.NONE,
                             GLib.OptionArg.NONE,
                             “Shows program version”,
                             null);
        GLib.set_application_name(“Handling”);
    },
    vfunc_activate: function() {
        this.parent();
    },
 
    vfunc_startup: function() {
        this.parent();
    },
    vfunc_handle_local_options: function(options) {
        if (options.contains(‘version’)) {
            print(this._version);
            return 0;
        }
        return -1;
    },
    vfunc_shutdown: function() {
        this.parent();
    }
});
(new Handling()).run([System.programInvocationName].concat(ARGV));

Соответствующие части:

  1. Класс должен «расширять» Gio.Application (или любой подкласс).
  2. ApplicationFlags должны быть установлены при инициализации объекта. По умолчанию — FLAGS_NONE.
  3. Каждый аргумент для обработки определяется с помощью метода add_main_option. Вы можете определить столько параметров, сколько хотите, используя этот метод. В этом примере я решил обрабатывать «версию программы».
  4. Место, где вы «обрабатываете» каждый аргумент, находится в методе vfunc_handle_local_options. Если возвращаемое значение функции является неотрицательным, то синтаксический анализ оставшихся аргументов останавливается и процесс завершается.

Теперь давайте протестируем пример кода:

$ ./handling2.js --version
0.1
$
$ ./handling2.js -v
0.1
$
$ ./handling2.js --help
Usage:
  gjs [OPTION...]
Help Options:
  -h, --help                 Show help options
  --help-all                 Show all help options
  --help-gapplication        Show GApplication options
Application Options:
  -v, --version              Shows program version
$
$ ./handling2.js --force
Unknown option --force

Удивительно, но использование GApplication не только предлагает стандартный способ обработки аргументов командной строки, но также анализирует общие параметры как «помощь» и отлавливает недопустимые аргументы.

И это все, есть и другие способы обработки аргументов командной строки, которые я покажу по мере изучения.