NodeJS Exec cp с расширением скобки дает разные результаты.Зачем? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть команда grunt-shell, которая создает файлы изображений cp с использованием расширения скобок.

file: Gruntfile.js
cpImgTmp: {
    command: 'cp ./app/images/{*.png,*.jpg,*.ico} tmp/images' 
}

Когда я запускаю эту команду grunt-shell в MacOS, она выполняет то, что ожидается, но возвращает 'не может cp ... 'ошибка в Ubuntu.

Я искал в grunt-shell lib и заметил, что он использует функцию exec.Я еще раз протестировал команду в контролируемой среде

exec('cp ./app/images/{*.png,*.jpg,*.ico} tmp/images')

и подтвердил, что аргументы вызова функции exec одинаковы:

['/bin/sh', '-c', 'cp ./app/images/{*.png,*.jpg,*.ico} tmp/images']

Я успешно выполнил команду внутри серверного терминала Ubuntu.Итак, мой вопрос - это проблема с обработкой nodejs расширения скобок в различных средах, и какие опции я могу передать nodejs, чтобы эта команда работала в ОС Unix?

1 Ответ

0 голосов
/ 09 декабря 2018

Я подумал, что это не проблема nodejs, а проблема оболочки unix, которой может избежать nodejs.

Проблема в том, что sh не поддерживает скобки, bash поддерживает.На моем Mac sh является символической ссылкой на bash, а ubuntu (18.04) sh является символической ссылкой на dash (по результатам это явно не поддерживает скобкирасширение).

Решение состоит в том, чтобы передать скобу {shell: '/bin/bash'} для работы в Unix вместо оболочки по умолчанию '/ bin / sh'.

пример с использованием функции NodeJS exec: `exec ('cp ./app/images/ndom.png,.jpg,*.ico} tmp / images', {shell: '/ bin / bash'})

пример использования grunt-shell

cpImgTmp: {
    command: 'cp ./app/images/{*.png,*.jpg,*.ico} tmp/images',
    options: {
        execOptions: {shell: '/bin/bash'}
    }
}
...