2016-11-24 3 views
1

Запуск следующих моих стандартных терминальных работ OSX, как и ожидалось:НПМ скрипт не с командами, с помощью процесса замены

$ diff <(ls dir1) <(ls dir2) 
correct output here 

Но когда я пытаюсь запустить его в качестве сценария НПМ, он не:

$ npm run diff 
sh: -c: line 0: syntax error near unexpected token `(' 
sh: -c: line 0: `diff <(ls src) <(ls dist)' 

Когда я сменил сценарий NPM на "bash -c 'diff <(ls dir1) <(ls dir2)'", он сначала выводит желаемый результат, а затем все же выдает ошибку (статус выхода 1).

Edit: Эти странные <() символы process substitutions кстати. Просто узнал о них.

+0

Статус выхода может быть статусом выхода diff, который равен 1, если файлы или ваши входы различны, поэтому не обязательно ошибка? –

ответ

3

В дополнение Stefan Hegny's helpful answer справочная информация:

https://docs.npmjs.com/misc/scripts От:

Сценарии запускаются при прохождении линии в качестве аргумента сценария к sh.

Если сценарий завершен с кодом, отличным от 0, то это прервет процесс.

В частности, содержание целевого "scripts" записи из файла package.json передается sh -c в качестве аргумента, так что командная строка эквивалент вашей команды будет:

sh -c 'diff <(ls dir1) <(ls dir2)' 

который потерпит неудачу в Точно так же, потому что когда Bash вызывается как sh, дизайн не признает process substitutions (<(...)), потому что он работает в Режим совместимости POSIX.

процесс замена не части POSIX: они являются Башем конкретных расширения (также поддерживаются в zsh и ksh).

Для переносимости, вы должны всегда использовать POSIX-mandated shell features в ваших "scripts" записей - если вы явно не вызвать определенную оболочку (как в ответ Стефана), либо непосредственно, либо путем вызова скрипта файл которого притон линия указывает оболочка для использования.

Различные оболочки действуют как sh на разных платформах, и единственными функциями, на которые вы можете положиться, являются те, которые определены POSIX.

Также ноты, как ответ Стефана использует || exit 0 в конце команды Bash, с тем, чтобы гарантировать, что общее командование всегда передает код выхода 0, чтобы убедиться, что npm не прервать обработку.

+1

Kudos @ mklement0 Я на самом деле понятия не имел о себе. –

2

Попробуйте

"bash -c 'diff <(ls dir1) <(ls dir2) || exit 0'"