Для одной из моих боковых проектов мне нужно было выполнить определенные команды оболочки с помощью JavaScript. Этот проект является проектом электронов реагирования, в котором – благодаря электронной структуре – у меня есть Полный доступ к API Node.js И там выполнение Node.js. Для читателей, которые заинтересованы в электроне или в сочетании электрона и реагируют, вы можете найти мои блоги на те тем, соответственно здесь и здесь Отказ Хотя можно выполнить команды оболочки в JavaScript, есть два важных замечания: сначала, что Выполнение команд Shell использует API Node.js Так что имейте в виду, что он работает только в среде, которая имеет доступ к этому API (то есть нормальное время выполнения браузера не будет работать). Во-вторых, Некоторые команды Shell требуют административных разрешений Таким образом, в этих случаях вам необходимо убедиться, что процесс, выполняющий код JavaScript, имеет такие разрешения.
У Node.js API есть модуль под названием Child_Process который предлагает функции для порождающих детей, как в ансинхроне, как асинхронная манера. Один из этих функций, которые доступны, это функция exec. . Имеет следующую подпись:
exec(command[, options][, callback])
С параметрами: команда как строка, опции Как объект с различными вариантами (см. Документацию для получения дополнительной информации) и A Функция обратного вызова . Сама функция возвращает ссылку на породительный процесс (но он не нужен для выполнения команд оболочки).
С Exec Функция Мы можем создать пользовательскую функцию с двумя разными обратными вызовами:
const { exec } = require('child_process');
export const executeCommand = (cmd, successCallback, errorCallback) => {
exec(cmd, (error, stdout, stderr) => {
if (error) {
// console.log(`error: ${error.message}`);
if (errorCallback) {
errorCallback(error.message);
}
return;
}
if (stderr) {
//console.log(`stderr: ${stderr}`);
if (errorCallback) {
errorCallback(stderr);
}
return;
}
//console.log(`stdout: ${stdout}`);
if (successCallback) {
successCallback(stdout);
}
});
};
Хотя не требуется, использование такой функции гораздо механизм и очиститель, поскольку вы можете использовать функции другого обратного вызова для успеха и ошибки. Кроме того, существует одна точка, в которой вы можете включить или выключить регистрацию для всех ваших команд.
Поскольку мы получили нашу базовую функцию для выполнения команд, мы можем создавать сейчас различные функции для различных команд, которые необходимо выполнить код. В зависимости от того, какая система операционной системы вы нацеливаетесь, может быть возможна, что необходимы другие (оболочки) команды (например, команда dir в Windows и Ls Команда на Linux). Ради примера вы можете получить текущий филиал GIT со следующей командой GIT:
git -C "folder" rev-parse --abbrev-ref HEAD
Мы можем создать пользовательскую функцию для этого, принимая папку и два обратных вызова для выполнения:
export const getGitBranchCommand = (folder, success, error) => {
executeCommand(
`git -C ${folder} rev-parse --abbrev-ref HEAD`,
branch => success(branch),
errormsg => error(errormsg)
);
};
Этот функционал будет называть Успех Обратный вызов с выходом команды Shell (который является именем ветви) или вызовите Ошибка . Обратный вызов с сообщением Команда возвращается при неисправности.
Некоторые команды Shell Print Ptept много текста к потоку Stout, поэтому для тех команд вам необходимо применить регенцию для анализа данных, которые вы хотите из этого вывода.
Многие приложения используют государственную структуру для сохранения текущего состояния вашего приложения. Скорее всего, вы, читатель, используете такую рамку в вашем проекте, и вы захотите сохранить результат команд, которые вы выполняются в этом состоянии. В моем примере я использую Redux Но вы можете следовать аналогичным подходу для других рамки. Используя GetGitbranchCommand Приведенные выше Вы можете создать новую функцию, специфичную для Framework Redux:
export const getGitBranch = (folder, dispatch) => {
getGitBranchCommand(folder, branch =>
dispatch(setFocusProjectGitBranch(branch), () => {})
);
};
Теперь у вас есть функция, которая принимает папку и функцию отправки (необходима для диспетчеризации действий в redux). Эта функция теперь может использоваться в любом месте вашего приложения. В фрагменте кода выше я использовал setfocusprojectgitbranch Функция, которая является создателем действий (если вы не знаете, что то есть, не беспокоит, что это Credux, специфичный). Кроме того, на боковом узле обратный вызов ошибки – это пустая функция, поскольку мне не нужно сообщение об ошибке (пока).
Я хотел бы обобщить BlogPost, обсудив использованную архитектуру:
getGitBranch(folder,dispatch) => getGitBranchCommand(folder, success, error) => executeCommand(cmd, successCallback, errorCallback) => exec(command[, options][, callback])
ExecuteCommand является общей функцией для выполнения любой команды, используя Exec Функция из Child_Processes Модуль узла Отказ Эта функция используется GetGitBranchCommand , функция, специфичная для получения ветви GIT. Наконец, самая высокая функция, которая подвергается всему моему приложению, и является функцией зависимой основой государственной структуры управления. Это выполняет ранее упомянутое GetGitbranchCommand Функция и хранит результат в состоянии, используя API государственного управления.
Использование этой архитектуры имеет преимущество в том, что, когда вы повторно используете код в другом проекте, но с другой структурой управления государством, вам нужно только заменить Функция GetGitBranch Отказ Кроме того, если вы, например, поддержите другие операционные системы, которые могут потребовать разных команд, чтобы сделать то же самое, вам нужно только заменить GetGitbranchCommand функция.
Оригинал: “https://dev.to/alexdhaenens/how-to-execute-shell-commands-in-js-2j5j”