"노드" 스크립트 한 줄의 결과를 반환하는 함수를 작성하는 방법은 무엇입니까?

"노드" 스크립트 한 줄의 결과를 반환하는 함수를 작성하는 방법은 무엇입니까?

한 줄의 스크립트를 사용하여 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

관련 정보