1行のスクリプトを使用してJSONファイルからキー値を読み取る非常に単純なbash
関数を作成しようとしています。node
現在実施中の事項は次のとおりですutils.bash
。
#!/bin/bash
project_name() {
echo $(node -e "require('../package.json').name;")
}
はい、JSONデータに直接アクセスできるツールがあることはわかっていますが、すべての開発チームがすでにそのツールを持っているため、node
これは新しい依存関係ではなく既存の依存関係です。
ファイルを実行可能にしましたがsource scripts/utils.bash
(コマンドラインで)、次のように関数を参照しようとすると、次のようになります。
PROJECT_NAME=project_name
出力は私が入力した行です。単に実行しようとするとエラーがproject_name
発生します。node
Error: Cannot find module '../package.json'
スクリプトutils.bash
はプロジェクトscripts
フォルダにあり、package.json
ファイルは親フォルダにあります。私は親フォルダでこれを行います(これは重要ではないことを願っていますが)。インポートしようとしましたが、'./package.json'
エラーが発生しました。
私が望む最終結果は、name
複数のスクリプトを介してキー値を参照できるようになることです。project.json
bash
どうすればいいですか?
答え1
まあ、問題PROJECT_NAME=project_name
はそうしなければならないということだPROJECT_NAME="$(project_name)"
。この場合は割り当て内にあるため、引用符は必要ありません。スカラー変数にすることができますが、他の多くの状況(例:echo $(...)
)、引用符を省略するとは、結果を$IFS
文字に分割し、結果の単語にワイルドカードを実行することを意味します(不要)。
関数は実行中のものと同じ作業ディレクトリを持ち、現在の場所にあると言いますscripts
。したがって、関数は./../package.json
notを探しています./scripts/../package.json
。
./package.json
したがって、(現在の作業ディレクトリではなくデフォルトの検索パスを見つけるためのpackage.json
noなしのパス/
とは異なり)、エラーが発生する理由を見つけることをお勧めします。node
node
また、を使用してconsole.log()
値を出力する必要があります。echo
意味のないコンテンツを削除$(...)
(特に$(...)
上記のように引用されていない項目)。だから:
package_name() {
node -e "console.log(require('./package.json').name)"
}
PACKAGE_NAME="$(package_name)" || handle error from node if any