2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

npm scripts内の`echo`でダブルクォートを出力させたい

Last updated at Posted at 2020-10-29

TL;DR

こんなことを

echo \"

npm scriptsで再現したければ、こう書きます。

package.json
  "scripts": {
    "double-quote": "echo \\\""
  }

目的

こんなシェルコマンドを叩いて、

echo { \"home\": \"$HOME\" } > home.json

変数を展開したJSONファイルを作りたかったんですね。

home.json
{ "home": "/home/myname" }

しかもnpm scriptsに書きたかったんです。

npm scriptsでは挙動が違う

シェルで実行するときのままこう書くと、

package.json
  "scripts": {
    "create-json": "echo { \"home\": \"$HOME\" } > home.json"
  }

npm runは正常終了するものの、出来上がるファイルはこんな感じ。
ダブルクォートが消えちゃってInvalid JSONです。

home.json
{ home: /home/the-red }

上記のscriptは、シェルでこう打ち込むのと一緒なんですね。

echo { "home": "$HOME" } > home.json

\"で「ダブルクォート1文字」扱いになってしまう。

どうするか?

こうするのです!

package.json
  "scripts": {
    "create-json": "echo { \\\"home\\\": \\\"$HOME\\\" } > home.json"
  }

\\\そのものを出力、
\""そのものを出力、
合わせて\"そのものを出力、という感じ。ややこしや。

この程度なら良いけど、あんまり複雑なJSONファイルを作りたいときは、
scriptsに直接書くのはやめたほうが良さそうですねー。

余談

シングルクォート使えばいいんじゃね?

package.json
  "scripts": {
    "create-json": "echo '{ \"home\": \"$HOME\" }' > home.json"
  }

ダメなのです。

home.json
{ "home": "$HOME" }

シングルクォートだとシェル変数が展開されないのである。

変数使わないJSONを出力したいなら、まぁシングルクォートで良いけど、
それならscriptで出力させる必要なんかそもそも無いわけで。

クォートしなければいいんじゃね?

package.json
  "scripts": {
    "create-json": "echo { home: $HOME } > home.json"
  }

だからInvalid JSONになるんだってば!

home.json
{ home: /home/the-red }

JSONじゃなくてJSを出力させればいいんじゃね?

package.json
  "scripts": {
    "create-js": "echo module.exports = { home: \\'$HOME\\' } > home.js"
  }
home.js
module.exports = { home: '/home/the-red' }

うん、、、そうね。趣旨が全然変わってしまったね。
この辺にしときます~。

2
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?