Shelljs - Unix shell commands for Node.js
Shelljs — это синтаксический анализатор языка сценариев в Node.js с богатыми и мощными базовыми разрешениями для операций (Windows/Linux/OS X). Shelljs — это, по сути, подключаемый модуль инкапсуляции команд на уровне уровня, основанный на узле, так что разработчики внешнего интерфейса могут напрямую писать команды оболочки в наиболее знакомом коде javascript для достижения функций, не полагаясь на Linux или инструмент преобразования, подобный cmder.
-
Решать проблему
Сценарии оболочки знакомы во внешнем интерфейсе, и каждый использовал их в конфигурации package.json для
"build": "umi build && node zip.config.js"
Например, npm run build сначала выполнит сборку umi, а затем запустит скрипт zip.config.js.Что делает скрипт zip.config.js, так это то, что если папки сборки нет, папка сборки будет сгенерирована и сжата и упакован с помощью easyzip. В противном случае, если папка сборки существует, создайте zip-архив или другие файлы, необходимые компании.
То, что делает shelljs, — это автоматизация, избавляющая от трудоемких повторяющихся рутинных действий, повышающая эффективность разработки и рабочее настроение. -
базовая грамматика
//引入shelljs var shell = require('shelljs') //检查控制台是否以运行`git `开头的命令 if (!shell.which('git')) { //在控制台输出内容 shell.echo('Sorry, this script requires git'); shell.exit(1); } shell.rm('-rf','out/Release');//强制递归删除`out/Release目录` shell.cp('-R','stuff/','out/Release');//将`stuff/`中所有内容拷贝至`out/Release`目录 shell.cd('lib');//进入`lib`目录 //找出所有的扩展名为js的文件,并遍历进行操作 shell.ls('*.js').forEach(function (file) { /* 这是第一个难点:sed流编辑器,建议专题学习,-i表示直接作用源文件 */ //将build_version字段替换为'v0.1.2' shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file); //将包含`REMOVE_THIS_LINE`字符串的行删除 shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file); //将包含`REPLACE_LINE_WITH_MACRO`字符串的行替换为`macro.js`中的内容 shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file); }); //返回上一级目录 shell.cd('..'); //run external tool synchronously //即同步运行外部工具 if (shell.exec('git commit -am "Auto-commit"').code !== 0){ shell.echo('Error: Git commit failed'); shell.exit(1); }
-
Пример объяснения
- shell.which(command)
Найдите адрес указанной команды в переменной окружения PATH, определите, является ли команда исполняемой, и верните абсолютный адрес команды.
-
echo
Вывести указанный контент в консоль
.to(index.txt) записать в файл -
exit(code)
Выйти из текущего процесса с кодом выхода в виде кода -
rm([опции, ]файл[ файл...])
Удаляет один или несколько файлов или каталогов в каталоге. После удаления его невозможно восстановить.
Общие параметры:
- -f: Принудительно удалить файл;
- -i: спросить пользователя перед удалением;
- -r: рекурсивно обрабатывать каталоги;
- -v: показать процесс обработки;
shell.rm('-rf', staticSplash);
-
cp([options,] source_array, dest) cp('-R','index.txt', '~/newCopy/') cp('-R',['index.txt', 'old.txt'], '~/newCopy/')
Используется для копирования одного или нескольких исходных файлов или каталогов в указанный файл или каталог.
Общие параметры:
- -f:force (default behavior)
- -L: follow symlinks
- -r,-R: recursive
- -n: no-clobber
- -u: only copy if source is newer than dest
- -P: don't follow symlinks
-
cd
Переключить рабочий каталог на указанный относительный или абсолютный путь. cd.. Чтобы вернуться на предыдущий уровень, cd- возвращает в предыдущий каталог.
-
ls
Используется для отображения списка целей.
Общие параметры:
- -a: показать все файлы;
- -C: отображать результаты запроса в нескольких столбцах;
- -l: отображать результаты запроса в длинном формате с одним столбцом (в отличие от -C);
- -R: процессы каталогов рекурсивно;
- -A: Все файлы (включая файлы, начинающиеся с ., кроме . и ..)
- -d: указать сам каталог, а не его содержимое
ls(path.join('bundle', 'css/')).forEach(cssName => { *** })
-
sed([options,] search_regex, replacement, file_array
Замените содержимое в file_array, соответствующее search_regex, заменой, которая поддерживает обычную самоссылку группы захвата. Обрабатывайте одну строку за раз, отправляйте содержимое буфера на экран после обработки, затем обрабатывайте следующую строку и повторяйте цикл до конца.
Общие параметры:
- -i: прямой исходный файл
-
cat([options,] file [, file ...])
Чтение содержимого одного или нескольких файлов.Если указан один файл, считывается файл, а если указано несколько файлов, содержимое объединяется и считывается.
Доступные Варианты:
-n: number all output lines -
exec(command [, options] [, callback])
Выполнить пришедшую команду
- async: выполнять ли асинхронно, по умолчанию установлено значение false, оно будет автоматически включено при передаче обратного вызова в
- молчание: не выводить информацию на консоль, по умолчанию false
- кодировка: по умолчанию utf8
Если не указано иное, команда выполняет данные данные синхронно. в синхронизации режиме он возвращает ShellString (совместимый с ShellJS v0.6.x, возвращает объект вида {code:..., stdout:..., stderr:...}). В противном случае это вернет дочерний процесс объект, а обратный вызов получает параметры (code, stdout, stderr).
Примечание. Для долгоживущих процессов лучше всего запускать exec() асинхронно.
-
chmod
Установить права доступа к файлам
- -c: выводить диагностику для каждого обработанного файла
- -v: like verbose, but report only when a change is made
- -R: change files and directories recursively
u означает владельца файла, g означает ту же группу, o означает другую, a означает все
+ означает увеличение полномочий, - означает отмену полномочий, = означает только установку полномочий
r означает доступный для чтения, w означает доступный для записи, x означает исполняемый файл, X означает, что файл является подкаталогомchmod(755, '/Users/brandon'); chmod('755', '/Users/brandon'); // same as above chmod('u+x', '/Users/brandon'); chmod('-R', 'a-w', '/Users/brandon');
-
pushd([options,][dir|'-N'|'+N'])
Доступные Варианты
-n: подавлять обычные изменения каталогов при добавлении каталогов в стек, чтобы манипулировать только стекомпараметр
- dir: сделать текущий рабочий каталог вершиной стека, затем сделать эквивалент cd dir
- +N: переместите N-й каталог (слева в списке, напечатанном каталогами, начиная с нуля) в начало списка, вращая стек.
- -N: переместить N-й каталог (справа от списка, напечатанного каталогами, считая с нуля) в начало списка, вращая стек.
echo(process.cwd()); // 当前文件父路径 /Users... pushd('/etc') // /private/etc /Users... pushd('+1') // users... /private/etc
Сохраните текущий каталог в верхней части стека каталогов, затем перейдите в каталог cd. Без аргументов pushd меняет местами первые два каталога. Возвращает массив путей в стеке.
-
popd([опции,]['-N'|'+N'])
Доступные Варианты:
-n: подавлять обычные изменения каталогов при удалении каталогов из стека, чтобы можно было манипулировать только стеком.параметр:
- +N: удалить N-й каталог (считается слева от списка, напечатанного каталогами), начиная с нуля
- -N: Удалить N-й каталог (считая справа от списка, напечатанного каталогами), начиная с нуля.
echo(process.cwd()); // '/usr' pushd('/etc'); // '/etc /usr' echo(process.cwd()); // '/etc' popd(); // '/usr' echo(process.cwd()); // '/usr'
Если аргументы не указаны, popd удалит каталог верхнего уровня из стека и выполнит cd в новый каталог верхнего уровня. Элементы нумеруются с 0, начиная с первого каталога, указанного в dirs, то есть popd эквивалентен popd+0. Возвращает массив путей в стеке
-
dirs([options|'+N'|'-N']
Доступные Варианты:
-c: очистить стек каталогов, удалив все элементыпараметр:
- +N: Отобразить N-й каталог (считая слева в списке, напечатанном каталогами при вызове без параметров), начиная с нуля
- -N: отображать N-й каталог (считая справа от списка, напечатанного каталогами при вызове без параметров), начиная с нуля
Отображает список запомненных в настоящее время каталогов. Возвращает массив путей в стеке или один путь, если указано +N или -N.
-
найти(путь[ путь...])
найти файлы
console.log(find('../Config/application.js'))
вернуть путь_массив
-
grep([options,]regex_filter,file[file...])
В отличие от fing для поиска файлов, grep используется для поиска содержимого.
Доступные Варианты:
- -v: инвертировать значение регулярного выражения и вывести строки, не соответствующие условию
- -l: печатать только имена соответствующих файлов
grep('-v', 'GLOBAL_VARIABLE', '*.js'); grep('GLOBAL_VARIABLE', '*.js');
Считывает входную строку из заданного файла и возвращает строку, содержащую Все строки файлов, соответствующие данному файлу regex_filter
-
глава([{'-n':},]файл[файл...])
Прочитать начало файла
Доступные Варианты:
-n : отобразить первую строку файлаconsole.log(head('bundle.js')) console.log(head({'-n':1},'bundle.js')) // 获取第一行
-
хвост([{'-n':},]файл[файл...])
прочитать конец файла
Доступные Варианты: -n : показать последние несколько строк файла
var str = tail({'-n': 1}, 'file*.txt'); var str = tail('file1', 'file2'); var str = tail(['file1', 'file2']); // same as above
-
ln([options,]источник,назначение)
Создать ссылку
ln('file', 'newlink'); // /Users.../newlink ln('-sf', 'file', 'newlink'); //如果newlink存在,则强制链接🔗
-
mkdir([опции,]каталог[каталог...])
Создать папку
Доступные Варианты:
-p: полный путь (при необходимости будет создан промежуточный каталог)shell.mkdir('bundle') shell.mkdir('-p', ['bundle', 'js'])
-
touch([параметры, ]файл[ файл...])
В отличие от mkdir, который создает папки, touch создает файлы.
Доступные Варианты:
- -a: изменить только время доступа
- -c: не создавать никаких файлов
- -m: изменить только время модификации
- -d ДАТА: указать время
- -r ФАЙЛ: заменить время нового файла на время ФАЙЛА
-
mv([options,]источник[источник...],назначение')
переехать
Доступные Варианты:
- -f:force (поведение по умолчанию)
- -n: не затирать
mv('move', 'target'); // 将move文件移动到target文件夹
-
pwd()
Просмотр текущего каталога
-
установить (варианты)
Установить глобальные переменные конфигурации
Доступные Варианты:
- +/-e: выход при ошибке (config.fatal)
- +/-v:verbose:показать все команды(config.verbose)
- +/-f: отключить расширение имени файла (подстановку)
set('-e'); // exit upon first error set('+e'); // this undoes a "set('-e')"
-
sort([параметры, ]файл[ файл...])
Сортировка контента
Доступные Варианты:
- -r: инвертировать результат сравнения
- -n: сравнить по значению
sort('foo.txt', 'bar.txt'); sort('-r', 'foo.txt');
Возвращает содержимое файла, отсортированное построчно. сортировать несколько
-
тестовое задание()
определение типа файла
Доступные Варианты:
'-b', 'путь': true, если путь является блочным устройством
'-c', 'путь': true, если путь является символьным устройством
'-d', 'путь': верно, если путь является каталогом
'-e', 'путь': true, если путь существует
'-f', 'путь': верно, если путь является обычным файлом
'-L', 'путь': верно, если путь является символической ссылкой
'-p', 'путь': true, если путь является каналом (FIFO)
'-S', 'путь': true, если путь является сокетомif (!test('-f', path)) continue;
-
uniq([опции,][вход,[выход]])
Доступные Варианты:
- -i: игнорировать регистр при сравнении
- -c: сортировать префиксы по количеству вхождений
- -d: печатать только повторяющиеся строки, по одной на каждую строку
-
ShellString()
Конструктор преобразует строку в строку оболочки, а преобразованная строка поддерживает цепочку вызовов специальных команд оболочки.
ShellString('hello world')
-
ShellString.Prototype.to()
Вывести shellString в указанный файл, что эквивалентно > на языке сценариев
-
ShellString.Prototype.toEnd()
Добавить shellString к указанному файлу, что эквивалентно >> на языке сценариев
-
env['VAR_NAME']
указывает на process.env
-
Поддержка цепочек вызовов Pipes
sed, grep, cat, exec, to, toEnd все поддерживают связанные вызовы
-
Configuration
- config.silent
sh.config.silent
- config.fatal
config.fatal
- config.verbose
config.verbose
- config.globOptions
config.globOptions
- config.reset() сбрасывает глобальный
shell.config.reset()
- config.silent