Fi sh и Bash кроссплатформенное переменное расширение - PullRequest
0 голосов
/ 03 марта 2020

У меня есть этот скрипт в моем package.json, который принимает env var в качестве параметра:

"scripts": {
  "foo": "./bin/foo-script.sh ${BAR}",
}

Fi sh естественным образом выдает ошибку fish: Variables cannot be bracketed. In fish, please use {$BAR}.

Я думал это сработало бы, если бы я позвонил с bash -c:

"foo": "bash -c ./bin/foo-script.sh ${BAR}"

Но это не так, та же ошибка.

Несколько человек должны использовать package.json, поэтому нужно работать как в Fi sh, так и в Bash.

1 Ответ

2 голосов
/ 03 марта 2020

Просто используйте $BAR:

"scripts": {
   "foo": "./bin/foo-script.sh $BAR",
}

Форма ${BAR} не имеет функции цитирования, она просто отделяет имя переменной от окружающих строк (например, такие вещи, как ${HOME}foo - $HOMEfoo будут разверните переменную с именем «HOMEfoo»).

Обратите внимание, что в общем случае запуск сценариев в «оболочке пользователя» является плохой идеей. Система, которая запускает сценарий оболочки, должна указывать ожидаемую оболочку, например / bin / sh или fi sh

Причина, по которой ваша попытка использовать bash -c не работает, заключается в том, что вы цитируете выкл. Вы даете fi sh команду

bash -c ./bin/foo-script.sh ${BAR}

, что означает, что fi sh пытается выполнить расширение, потому что оно не заключено в кавычки, и поэтому оно видит его как синтаксическую ошибку и отклоняет команду.

Это может сработать, если вы процитируете аргумент:

bash -c './bin/foo-script.sh ${BAR}'

, потому что тогда, к fi sh, ${BAR} заключен в одинарные кавычки, поэтому его не волнует их.

...