shelljs
Portable Unix shell commands for Node.js
ShellJS - Unix shell commands for Node.js
ShellJS is a portable (Windows/Linux/OS X) implementation of Unix shell commands on top of the Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts!
ShellJS supports node v0.11
, v0.12
, v4
, v5
, v6
, and all releases of iojs.
The project is unit-tested and battled-tested in projects like:
- PDF.js - Firefox's next-gen PDF reader
- Firebug - Firefox's infamous debugger
- JSHint - Most popular JavaScript linter
- Zepto - jQuery-compatible JavaScript library for modern browsers
- Yeoman - Web application stack and development tool
- Deployd.com - Open source PaaS for quick API backend generation
- And many more.
If you have feedback, suggestions, or need help, feel free to post in our issue tracker.
Think ShellJS is cool? Check out some related projects (like cash--a javascript-based POSIX shell) in our Wiki page!
Upgrading from an older version? Check out our breaking changes page to see what changes to watch out for while upgrading.
Command line use
If you just want cross platform UNIX commands, checkout our new project shelljs/shx, a utility to expose shelljs
to the command line.
For example:
$ shx mkdir -p foo $ shx touch foo/bar.txt $ shx rm -rf foo
A quick note about the docs
For documentation on all the latest features, check out our README. To read docs that are consistent with the latest release, check out the npm page or shelljs.org.
Installing
Via npm:
$ npm install [-g] shelljs
If the global option -g
is specified, the binary shjs
will be installed. This makes it possible to run ShellJS scripts much like any shell script from the command line, i.e. without requiring a node_modules
folder:
$ shjs my_script
JavaScript
require('shelljs/global'); if (!which('git')) { echo('Sorry, this script requires git'); exit(1); } // Copy files to release dir rm('-rf', 'out/Release'); cp('-R', 'stuff/', 'out/Release'); // Replace macros in each .js file cd('lib'); ls('*.js').forEach(function(file) { sed('-i', 'BUILD_VERSION', 'v0.1.2', file); sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file); sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file); }); cd('..'); // Run external tool synchronously if (exec('git commit -am "Auto-commit"').code !== 0) { echo('Error: Git commit failed'); exit(1); }
CoffeeScript
CoffeeScript is also supported automatically:
require 'shelljs/global' if not which 'git' echo 'Sorry, this script requires git' exit 1 # Copy files to release dir rm '-rf', 'out/Release' cp '-R', 'stuff/', 'out/Release' # Replace macros in each .js file cd 'lib' for file in ls '*.js' sed '-i', 'BUILD_VERSION', 'v0.1.2', file sed '-i', /^.*REMOVE_THIS_LINE.*$/, '', file sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file cd '..' # Run external tool synchronously if (exec 'git commit -am "Auto-commit"').code != 0 echo 'Error: Git commit failed' exit 1
Global vs. Local
The example above uses the convenience script shelljs/global
to reduce verbosity. If polluting your global namespace is not desirable, simply requireshelljs
.
Example:
var shell = require('shelljs'); shell.echo('hello world');
Command reference
All commands run synchronously, unless otherwise stated. All commands accept standard bash globbing characters (*
, ?
, etc.), compatible with thenode glob module.
For less-commonly used commands and features, please check out our wiki page.
cd([dir])
Changes to directory dir
for the duration of the script. Changes to home directory if no argument is supplied.
pwd()
Returns the current directory.
ls([options,] [path, ...])
ls([options,] path_array)
Available options:
-
-R
: recursive -
-A
: all files (include files beginning with.
, except for.
and..
) -
-d
: list directories themselves, not their contents -
-l
: list objects representing each file, each with fields containingls -l
output fields. See fs.Stats for more info
Examples:
ls('projs/*.js'); ls('-R', '/users/me', '/tmp'); ls('-R', ['/users/me', '/tmp']); // same as above ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...}
Returns array of files in the given path, or in current directory if no path provided.
find(path [, path ...])
find(path_array)
Examples:
find('src', 'lib'); find(['src', 'lib']); // same as above find('.').filter(function(file) { return file.match(/\.js$/); });
Returns array of all files (however deep) in the given paths.
The main difference from ls('-R', path)
is that the resulting file names include the base directories, e.g. lib/resources/file1
instead of just file1
.
cp([options,] source [, source ...], dest)
cp([options,] source_array, dest)
Available options:
-
-f
: force (default behavior) -
-n
: no-clobber -
-r
,-R
: recursive -
-L
: follow symlinks -
-P
: don't follow symlinks
Examples:
cp('file1', 'dir1'); cp('-R', 'path/to/dir/', '~/newCopy/'); cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp'); cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above
Copies files.
rm([options,] file [, file ...])
rm([options,] file_array)
Available options:
-
-f
: force -
-r, -R
: recursive
Examples:
rm('-rf', '/tmp/*'); rm('some_file.txt', 'another_file.txt'); rm(['some_file.txt', 'another_file.txt']); // same as above
Removes files.
mv([options ,] source [, source ...], dest')
mv([options ,] source_array, dest')
Available options:
-
-f
: force (default behavior) -
-n
: no-clobber
Examples:
mv('-n', 'file', 'dir/'); mv('file1', 'file2', 'dir/'); mv(['file1', 'file2'], 'dir/'); // same as above
Moves files.
mkdir([options,] dir [, dir ...])
mkdir([options,] dir_array)
Available options:
-
-p
: full path (will create intermediate dirs if necessary)
Examples:
mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above
Creates directories.
test(expression)
Available expression primaries:
-
'-b', 'path'
: true if path is a block device -
'-c', 'path'
: true if path is a character device -
'-d', 'path'
: true if path is a directory -
'-e', 'path'
: true if path exists -
'-f', 'path'
: true if path is a regular file -
'-L', 'path'
: true if path is a symbolic link -
'-p', 'path'
: true if path is a pipe (FIFO) -
'-S', 'path'
: true if path is a socket
Examples:
if (test('-d', path)) { /* do something with dir */ };
wemall 开源微商城 ,微信商城,商城源码,三级分销,微生鲜,微水果,微外卖,微订餐---专业的o2o系统
wemall地址: http://www.wemallshop.com代码地址: http://js.koahub.com/home/feature/shelljs