シェルスクリプトで受け取った引数をnodeに渡すときダブルクオートで囲わないと引数が壊れる

タイトルがわかりにくすぎる。

なに

cliツールを書いている。 bin/cliシェルスクリプト

bin/cli hogefuga --arg='volume 30'

みたいなのコマンドを打ったときこのシェルスクリプトを経由して

./script.js $@

$@ の記述で、nodeのスクリプトに引数を横流しで渡していた。

すると、 process.argv の中身がおかしくなる。

  const [node, app, ...args] = process.argv
  console.log('args', args)

の結果が、

[ 'hogefuga', '--arg=volume', '30' ]

になって困ってしまった。

volume 30 のスペースの部分で分割されてしまっている。そんな意図はしていない……。 '--arg=parity 123' であってくれ…。

解決

$@ をダブルクオートで囲えばOKだった。

./script.js "$@"

こうすると引数が分割されずに期待通りになる。

[ 'hogefuga', '--arg=parity 123' ]


bash謎仕様すぎる。