Исходное выполнение командной строки работает, потому что оболочка bash
расширяет выражение --exclude-dir={node_modules,libs}
до --exclude-dir=node_modules --exclude-dir=libs
перед вызовом grep
. grep
рад принять несколько --exclude-dir
аргументов и исключит каталоги, которые соответствуют любому из указанных имен.
Проблема с командой в package.json
возникает из-за того, что npm
не использует bash
для запуска команды. Для запуска команды используется старый sh
.
В некоторых системах sh
- это просто другое имя для bash
, и в этих системах ввод оригинальной команды в package.json
будет работать. Предположительно система Ахмеда - одна из таких.
Однако в других системах (особенно в Debian и его потомках) sh
- это , а не - то же самое, что bash
В этих системах sh
- намного более простая оболочка, и она не расширяет выражение --exclude-dir={node_modules,libs}
. Так что grep
видит нерасширенный аргумент и думает, что ему говорят об исключении каталога, имя которого буквально {node_modules,libs}
. Очевидно, что это не даст желаемого результата.
Есть два очевидных способа исправить это. Один из них состоит в том, чтобы npm
сказать sh
, чтобы запустить bash
оболочку для выполнения оригинальной команды:
"todo": "bash -c \"grep -lir --color --exclude-dir={node_modules,libs} --exclude=package.json 'todo'\""
Другой вариант, который я предпочитаю, потому что он не включает несколько уровней оболочки или вложенных / экранированных кавычек, - это явное указание обоих имен каталогов в команде:
"todo": "grep -lir --color --exclude-dir=node_modules --exclude-dir=libs --exclude=package.json 'todo'"