# grunt-shell [![Build Status](https://travis-ci.org/sindresorhus/grunt-shell.svg?branch=master)](https://travis-ci.org/sindresorhus/grunt-shell) > Run shell commands A good way to interact with other CLI tools. For example, get the current Git branch with `git branch`. **Use [Stack Overflow](https://stackoverflow.com/questions/tagged/gruntjs) for support questions.** ## Install ``` $ npm install --save-dev grunt-shell ``` ## Usage ```js require('load-grunt-tasks')(grunt); grunt.initConfig({ shell: { options: { stderr: false }, target: { command: 'ls' }, another: 'ls ./src' // Shorthand } }); grunt.registerTask('default', ['shell']); ``` ## Examples ### Run command Create a folder named `test`. ```js grunt.initConfig({ shell: { makeDir: { command: 'mkdir test' } } }); ``` The `command` property supports templates: ```js grunt.initConfig({ testDir: 'test', shell: { makeDir: { command: 'mkdir <%= testDir %>' } } }); ``` You can also supply a function that returns the command: ```js grunt.initConfig({ shell: { hello: { command: () => 'echo hello' } } }); ``` Which can also take arguments: ```js module.exports = grunt => { grunt.loadNpmTasks('grunt-shell'); grunt.initConfig({ shell: { greet: { command: greeting => `echo ${greeting}` } } }); grunt.registerTask('default', ['shell:greet:hello']); } ``` ### Run command and display the output Output a directory listing in your Terminal. ```js grunt.initConfig({ shell: { dirListing: { command: 'ls' } } }); ``` ### Custom callback Do whatever you want with the output. ```js function log(error, stdout, stderr, callback) { if (error) { callback(error); return; } console.log(stdout); callback(); } grunt.initConfig({ shell: { dirListing: { command: 'ls', options: { callback: log } } } }); ``` ### Option passed to the .exec() method Run a command in another directory. In this example, we run it in a subfolder using the `cwd` (current working directory) option. ```js grunt.initConfig({ shell: { subfolderLs: { command: 'ls', options: { stderr: false, execOptions: { cwd: 'tasks' } } } } }); ``` ### Multiple commands Run multiple commands by placing them in an array which is joined using `&&` or `;`. `&&` means run this only if the previous command succeeded. You can also use `&` to have the commands run concurrently (by executing all commands except the last one in a subshell). ```js grunt.initConfig({ shell: { multiple: { command: [ 'mkdir test', 'cd test', 'ls' ].join('&&') } } }); ``` ## Config ### command *Required*
Type: `string` `Function` Command to run or a function which returns the command. Supports underscore templates. *Command can be omitted by directly setting the target with the command.* ### cwd Type: `string` Shortcut. Same as `options.execOptions.cwd` (see below). ## Options ### stdout Type: `boolean`
Default: `true` Show stdout in the terminal. ### stderr Type: `boolean`
Default: `true` Show stderr in the terminal. ### stdin Type: `boolean`
Default: `true` Forward the terminal's stdin to the command. ### failOnError Type: `boolean`
Default: `true` Fail task if it encounters an error. Doesn't apply if you specify a `callback`. ### stdinRawMode Type: `boolean`
Default: `false` Set `stdin` to [act as a raw device](https://nodejs.org/api/tty.html#tty_readstream_setrawmode_mode). ### callback(error, stdout, stderr, callback) Type: `Function` Lets you override the default callback with your own. **Make sure to call the `callback` method when you're done.** Supply an error as the first argument to `callback` to print a warning and cause the task to fail. ### preferLocal Type: `boolean`
Default: `true` Execute local binaries by name like [`$ npm run-script`](https://www.keithcirkel.co.uk/how-to-use-npm-as-a-build-tool/). ### execOptions Type: `Object` Specify some options to be passed to the [.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) method: - `cwd` string *Current working directory of the child process* - `env` Object *Environment key-value pairs* - `setsid` boolean - `encoding` string *(Default: `'utf8'`)* - `timeout` number *(Default: `0`)* - `maxBuffer` number *(Default: `1000 * 1000 * 10` → 10 MB)* - `killSignal` string *(Default: `'SIGTERM'`)* ## License MIT © [Sindre Sorhus](https://sindresorhus.com)