「ノード」スクリプト1行の結果を返す関数を書くには?

「ノード」スクリプト1行の結果を返す関数を書くには?

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.jsonbash

どうすればいいですか?

答え1

まあ、問題PROJECT_NAME=project_nameはそうしなければならないということだPROJECT_NAME="$(project_name)"。この場合は割り当て内にあるため、引用符は必要ありません。スカラー変数にすることができますが、他の多くの状況(例:echo $(...))、引用符を省略するとは、結果を$IFS文字に分割し、結果の単語にワイルドカードを実行することを意味します(不要)。

関数は実行中のものと同じ作業ディレクトリを持ち、現在の場所にあると言いますscripts。したがって、関数は./../package.jsonnotを探しています./scripts/../package.json

./package.jsonしたがって、(現在の作業ディレクトリではなくデフォルトの検索パスを見つけるためのpackage.jsonnoなしのパス/とは異なり)、エラーが発生する理由を見つけることをお勧めします。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

関連情報