Estou tentando escrever uma função muito simples que usa um script bash
de uma linha para ler o valor de uma chave de um arquivo JSON. node
Aqui está o conteúdo atual de utils.bash
:
#!/bin/bash
project_name() {
echo $(node -e "require('../package.json').name;")
}
Sim, eu sei que existem ferramentas que me permitem acessar dados JSON mais diretamente, mas toda a equipe de desenvolvimento já possui node
, então é uma dependência existente e não uma nova.
Tornei o arquivo executável, mas quando tento source scripts/utils.bash
fazer referência à função (na linha de comando) da seguinte forma:
PROJECT_NAME=project_name
a saída é simplesmente a linha que digitei. Quando tento executar simplesmente project_name
, recebo um node
erro:
Error: Cannot find module '../package.json'
O utils.bash
script está na scripts
pasta do projeto e o package.json
arquivo está na pasta pai. Estou executando isso a partir da pasta pai (embora eu prefira que isso não importe). Eu tentei importar './package.json'
, mas isso também me deu um erro.
O resultado final que desejo é poder referenciar o valor da name
chave por project.json
meio de vários bash
scripts.
Como posso fazer isso?
Bem, o problema
PROJECT_NAME=project_name
é que deveria serPROJECT_NAME="$(project_name)"
. As aspas, nesse caso, não são necessárias, pois estão em uma atribuição a uma variável escalar , mas são um bom hábito, como em muitos outros contextos (incluindo o seuecho $(...)
), omitir aspas implica dividir o resultado em$IFS
caracteres e realizar globbing no resultado palavras que você não quer aqui.A função tem o mesmo diretório de trabalho de onde é executada e você disse que a executou no pai de
scripts
. Portanto, a função está procurando./../package.json
not./scripts/../package.json
.Portanto, você provavelmente desejará usar
./package.json
(nãopackage.json
como quando o caminho não tem/
,node
procura um caminho de pesquisa padrão em vez do diretório de trabalho atual) e descobrir por que está causando um erro.Você também precisará
node
gerar esse valor comconsole.log()
e remover aqueleecho
que$(...)
não faz sentido (especialmente aquele$(...)
sem aspas, como visto acima). Então: