Skip to content

Commit

Permalink
Add docs about quoting
Browse files Browse the repository at this point in the history
  • Loading branch information
antonmedv committed Aug 19, 2021
1 parent 2307d54 commit 98e7de7
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 2 deletions.
20 changes: 18 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,25 @@ without any imports.
Executes a given string using the `spawn` function from the
`child_process` package and returns `ProcessPromise<ProcessOutput>`.

Everything passed through `${...}` will be automatically escaped and quoted.

```js
let name = 'foo & bar'
await $`mkdir ${name}`
```

There is no need to add extra quotes. Read more about it in
[quotes](docs/quotes.md).

You can pass an array of arguments if needed:

```js
let count = parseInt(await $`ls -1 | wc -l`)
console.log(`Files count: ${count}`)
let flags = [
'--oneline',
'--decorate',
'--color',
]
await $`git log ${flags}`
```

For example, to upload files in parallel:
Expand Down
73 changes: 73 additions & 0 deletions docs/quotes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Quotes

When passing arguments to `${...}` there is no need to add quotes. **Quotes will
be added automatically if needed.**

```js
let name = 'foo & bar'
await $`mkdir ${name}`
```

For quotes **zx** uses special bash syntax (next commands are valid bash):

```bash
mkdir $'foo & bar'
$'ls' $'-la'
```

If you add quotes `"${name}"`, it will produce a wrong command.

If you need to add something extra, consider putting it inside curly brackets.

```js
await $`mkdir ${'path/to-dir/' + name}`
```

This will also work properly:

```js
await $`mkdir path/to-dir/${name}`
```

### Array of arguments

The `zx` can also take an array or arguments in the `${...}`. Items of the array
will be quoted separately and concatenated via a space. Do **not** add a `.join(' ')`.

```js
let flags = [
'--oneline',
'--decorate',
'--color',
]
await $`git log ${flags}`
```

If you already have a string with arrays, it's your responsibility
to correctly parse it and distinguish separate arguments. For example like this:

```js
await $`git log ${'--oneline --decorate --color'.split(' ')}`
```

### globbing and `~`

As everything passed through `${...}` will be escaped, you can't use `~`
or glob syntax. In order for this to work the zx provides
[globby package](../README.md#globby-package).

For instead of this:

```js
let files = '~/dev/**/*.md'
await $`ls ${files}`
```

Use `glob` function and `os` package:

```js
let files = await glob(os.homedir() + '/dev/**/*.md')
await $`ls ${files}`
```


0 comments on commit 98e7de7

Please sign in to comment.