標準出力先としてファイル名を指定するのではなく、ファイルの中身(body)を引数として渡すにはどうすればよいのか?
実験用スクリプト
確認のため、次の簡易的なシェルスクリプトで各コマンドライン引数を表示させる。
#!/bin/bash # test.sh — just dump arguments for i; do echo $i; done
入力ファイルとしては次のように改行やスペースを含んだ JSON ファイルを渡す
$ cat test.json
{
"firstName": "John",
"age": 25,
"address": {
"state": "NY",
"postalCode": "10021-3100"
}
}
実行コマンド
結果論としては、以下のように printf と cat をコンボすればよい
$ ./test.sh foo $(printf '%s' $(cat test.json)) bar
foo
{"firstName":"John","age":25,"address":{"state":"NY","postalCode":"10021-3100"}}
bar
解説
ポイントとなるのは次の箇所
$(printf '%s' $(cat test.json))
ここを単純に $(cat test.json) や bash 方言のショートカットである $(< test.json) とすると、改行・スペースを引数の区切りとしてみなされてしまう
$ ./test.sh foo $(cat test.json) bar
foo
{
"firstName":
"John",
"age":
25,
"address":
{
"state":
"NY",
"postalCode":
"10021-3100"
}
}
bar
この問題を回避するために、ファイルの中身全体を1文字列として扱うために printf '%s' でラップさせるというわけ。
Reference
- linux – command line arguments from a file content – Stack Overflow
http://stackoverflow.com/questions/4227994/command-line-arguments-from-a-file-content
bash test.sh foo “$(cat test.json)” bar