Доступ к утилитам командной строки

Инструментальная панель предоставляет Вам метод для использования утилит командной строки и сценариев в Вашем виджете. С этой возможностью можно использовать любые стандартные утилиты, включенные с системой или любые утилиты или сценарии, которые Вы включаете в своем виджете.

Системный метод

Выполнение утилиты командной строки или сценария в Вашем виджете требует, чтобы Вы использовали widget.system() метод. Метод определяется как:

widget.system("command", handler)

Параметры widget.system() метод:

Таблица 18  widget.system() параметры

Параметр

Определение

Пример

command

Строка, указывающая утилиту командной строки; может содержать параметры и флаги.

"/bin/ls -l -a"

handler

Когда утилита командной строки заканчивает выполнение, функция вызвала; выполнение переключателей команды между синхронными и асинхронными режимами. Если указано, обработчик должен принять параметр.

systemHandler

В зависимости от какого Вы передаете в параметр обработчика, Ваш вызов к widget.system() будет работать в одном из двух режимов: синхронный или асинхронный.

Синхронная работа

Используя widget.system() синхронно средние значения, что Вы собираетесь поддержать выполнение своего виджета, пока Вы не получаете результаты команды, которую Вы выполняете. Вы хотите использовать их этот путь при работе с командами, обеспечивающими вывод один раз и выполняющимися за короткий период времени.

То, если бы Вы хотели выполнить команду, пример этого был бы id из Вашего виджета:

widget.system("/usr/bin/id -un", null);

Первый параметр указывает команду, которую Вы хотите выполнить; здесь, Вы работаете id с флагом -un. Вы не указали обработчик событий для этой команды, таким образом, закончено все выполнение в Ваших остановах виджета до этой команды.

Выполнение id как показано выше выполняет команду, но любой вывод потерян, так как Вы не указываете желание той информации. Для получения его вывода укажите outputString свойство и сохраняет его в переменной:

var output = widget.system("/usr/bin/id -un", null).outputString;

Можно получить или выводимую строку, строку ошибки или выходное состояние команды при использовании widget.system() синхронно:

Таблица 19  widget.system() свойства во время синхронного использования

Свойство

Определение

Использование

outputString

Вывод команды, как помещено в stdout.

var output = widget.system("id -un", null).outputString;

errorString

Вывод команды, как помещено в stderr.

var error = widget.system("id -un", null).errorString;

status

Статус выхода команды.

var status = widget.system("id -un", null).status;

Асинхронная работа

Обеспечение обработчика как второй параметр widget.system() выполняет команду в асинхронном режиме. Это означает, что выполнение в Вашем виджете продолжается, в то время как выполняется команда. Обработчик, который Вы указываете, вызывают, когда команда закончена и должна принять отдельный объект в качестве параметра. Тот объект содержит последний вывод команды, поскольку это заканчивает выполнение. Можно получить эти свойства от него:

Таблица 20  widget.system() свойства объекта параметра обработчика конца

Свойство

Определение

object.outputString

Последний вывод команды, как помещено в stdout.

объект.errorString

Последний вывод команды, как помещено в stderr.

object.status

Статус выхода команды.

Поскольку команда работает асинхронно, может быть необходимо взаимодействовать с командой во время ее выполнения. Используя widget.system() асинхронно возвращает объект, который можно использовать для дальнейшего взаимодействия с командой:

var myCommand = widget.system("/sbin/ping foo.bar", endHandler);

Объект возвратился (и сохранил в myCommand) реагирует на многие методы и имеет различные свойства:

Таблица 21  widget.system() свойства и методы, доступные во время асинхронного использования

Опция

Цель

Описание

myCommand.outputString

Свойство

Текущая строка, записанная в stdout (стандартный вывод) командой.

myCommand.errorString

Свойство

Текущая строка, записанная в stderr (вывод стандартной погрешности) командой.

myCommand.status

Свойство

Статус выхода команды, как определено командой.

myCommand.onreadoutput

Обработчик событий

Функция вызвала каждый раз, когда команда пишет в stdout. Обработчик должен принять отдельный аргумент; когда вызвано, параметр содержит текущую строку, помещенную в stdout.

myCommand.onreaderror

Обработчик событий

Функция вызвала каждый раз, когда команда пишет в stderr. Обработчик должен принять отдельный аргумент; когда вызвано, параметр содержит текущую строку, помещенную в stderr.

myCommand.cancel()

Метод

Отменяет выполнение команды.

myCommand.write(string)

Метод

Пишет строка в stdin (стандартный ввод).

myCommand.close()

Метод

Завершения stdin (EOF).

Например, для выполнения команды ping и будьте уведомлены каждый раз, когда это пишет что-то в stdout, используйте этот код:

var myCommand = widget.system("/sbin/ping foo.bar", endHandler);
myCommand.onreadoutput = outputHandler;

Также можно использовать:

widget.system("/sbin/ping foo.bar", endHandler).onreadoutput = outputHandler;

Ваш onreadoutput обработчик должен принять параметр. Когда это вызывают, это передается строка, которой поместили новую строку в stdout:

function outputHandler(currentStringOnStdout){    // Code that does something with the command’s current output like...
    document.getElementById("element").innerText = currentStringOnStdout;}

Команды такой как ping выполненный неопределенно, таким образом, Вы, вероятно, хотите закончить его выполнение в некоторый момент. Используйте cancel() метод на объекте, из которого Вы получаете widget.system() сделать это:

myCommand.cancel();

Другие команды, такой как bc, потребуйте ввода в некоторый момент в их выполнении. Для записи в стандартный ввод (где эти команды ожидают свой ввод) используйте write() метод:

myCommand.write("8*5");

Закрыть эти команды должным образом (использующий конец файла, или EOF, сигнал), использовать close():

myCommand.close();

Не забывайте, что для этой команды для выполнения асинхронно необходимо обеспечить обработчик событий для конца выполнения. Этот обработчик передается тот же объект, создающийся, когда Вы сначала используете widget.system(). Это означает, что можно получить код состояния команды или, если Вы не использовали onreadoutput или onreaderror обработчики, можно получить полный вывод команды к stdout или stderr, соответственно.

Пример кода

The Voices Widget

Речевой демонстрационный виджет (доступный в Речевом демонстрационном проекте) использование widget.system() асинхронно. Когда Речь сначала открыта, это представляется:

function setup()
{
    if(window.widget) {
        currentlyBeingSpoken = widget.system("/usr/bin/osascript -e 'say \"Welcome to Voices!\" using \"Fred\"'" , doneSpeaking);
    }
}

Путем указания обработчика для того, когда команда закончена, выполнившись, команда работает асинхронно. Глобальная переменная, currentlyBeingSpoken, присваивается объект команды так, чтобы команды могли быть даны к нему во время его выполнения в случае необходимости. doneSpeaking() функция, вызванная, когда команда сделана, наборы currentlyBeingSpoken к NULL.

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

if(window.widget) {
    if(currentlyBeingSpoken != null) {
        currentlyBeingSpoken.cancel();
    }
    currentlyBeingSpoken = widget.system("/usr/bin/osascript -e 'say \"" + textToSpeak + "\" using \"" + chosenVoice + "\"'" , done);
}

Здесь currentlyBeingSpoken проверяется, чтобы видеть, находится ли команда уже в выполнении. Если так, cancel() метод вызывают на нем для остановки его, и затем новая команда дается. done() функция выполняет некоторое обслуживание пользовательского интерфейса и затем вызывает doneSpeaking() установить currentlyBeingSpoken к NULL.

Речь также имеет каждую речь, представляются, когда она выбрана в меню. Этот код следует за подобной логикой как за предыдущей выборкой:

function voiceChanged(elem)
{
    var chosenVoice = elem.options[elem.selectedIndex].value;
    document.getElementById("voiceMenuText").innerText = chosenVoice;
 
    if(window.widget) {
        if(currentlyBeingSpoken != null) {
            currentlyBeingSpoken.cancel();
            done();
        }
        currentlyBeingSpoken = widget.system(
                    "/usr/bin/osascript -e 'say \"Hi, I`m " +
                    chosenVoice + ".\" using \"" +
                    chosenVoice + "\"'" ,
                    doneSpeaking
                    );
    }
}