Амперсанд для запуска процесса в фоновом режиме вызывает недопустимые параметры в Bash 5

#bash

Вопрос:

У меня есть скрипт bash, который отлично работает на Bash 3.2. Скрипт содержит амперсанд для запуска процесса в фоновом режиме. Однако, когда я запускаю его в Bash 5.x, он неправильно передает переменные (я получаю «Синтаксическую ошибку: неожиданный конец ввода JSON»). Когда я снимаю амперсанд в конце (строки mgeneratejs), он обычно выполняется в Bash 5.

 #!/bin/bash
#Works on Bash 3.2 on MacOS

#Doesn't work in bash-5.0/5.1
##!/usr/bin/env bash

NUM_ROWS_PER_RUN=5
NUM_RUNS=2
TEMPLATE_STRING='{
        name: "$name"
        }'

for i in $(seq 1 "$NUM_RUNS")
do
    echo "Starting run ${i}"

    #If you dont have it, then run "npm install -g mgeneratejs"
    mgeneratejs -n "$NUM_ROWS_PER_RUN" "${TEMPLATE_STRING//[

Как я могу заставить процесс (mgeneratejs) запускаться в фоновом режиме при использовании Bash 5.x?


Комментарии:

1. эй, ты решил проблему? помог ли мой ответ?

2. @JuanR Спасибо тебе! Я внес изменения в сценарий из вашего ответа, и он отлично сработал.

Ответ №1:

Баш может быть виноват или не виноват здесь, но будьте уверены, что проблема в mgeneratejs этом .

Взглянув mgeneratejs на исходный код, я нашел это:

 if (process.stdin.isTTY) {
  var str = argv._[0];
  template = _.startsWith(str, '{') ? parseTemplate(str) : parseTemplate(read(str, 'utf8'));
  generate();
} else {
  template = '';
  process.stdin.setEncoding('utf-8');
  process.stdin.on('readable', function() {
    var chunk = process.stdin.read();
    if (chunk !== null) {
      template  = chunk;
    } 
  });
  process.stdin.on('end', function() {
    template = JSON.parse(template); 
    generate();
  });
} 
 

Если stdin это не TTY, то mgeneratejs предполагается, что stdin это канал, и пытается прочитать из него. Это неправильно, они должны, по крайней мере, проверить, был ли шаблон указан в аргументах командной строки.

Я бы не рекомендовал вам исправлять mgeneratejs , но я могу порекомендовать вам сделать это:

 function do_run() {
    echo "${TEMPLATE_STRING//[



rn ']}" amp;
done
echo "Waiting"
wait
echo "Finished"
Как я могу заставить процесс (mgeneratejs) запускаться в фоновом режиме при использовании Bash 5.x?

Комментарии:

1. эй, ты решил проблему? помог ли мой ответ?

2. @JuanR Спасибо тебе! Я внес изменения в сценарий из вашего ответа, и он отлично сработал.

Ответ №1:

Баш может быть виноват или не виноват здесь, но будьте уверены, что проблема в mgeneratejs этом .

Взглянув mgeneratejs на исходный код, я нашел это:


Если stdin это не TTY, то mgeneratejs предполагается, что stdin это канал, и пытается прочитать из него. Это неправильно, они должны, по крайней мере, проверить, был ли шаблон указан в аргументах командной строки.

Я бы не рекомендовал вам исправлять mgeneratejs , но я могу порекомендовать вам сделать это:


rn ']}" | mgeneratejs -n "$NUM_ROWS_PER_RUN"
}

for i in $(seq 1 "$NUM_RUNS")
do
echo "Starting run ${i}"

#If you dont have it, then run "npm install -g mgeneratejs"
do_run amp;
done

rn ‘]}» amp;
done
echo «Waiting»
wait
echo «Finished»Как я могу заставить процесс (mgeneratejs) запускаться в фоновом режиме при использовании Bash 5.x?

Комментарии:

1. эй, ты решил проблему? помог ли мой ответ?

2. @JuanR Спасибо тебе! Я внес изменения в сценарий из вашего ответа, и он отлично сработал.

Ответ №1:

Баш может быть виноват или не виноват здесь, но будьте уверены, что проблема в mgeneratejs этом .

Взглянув mgeneratejs на исходный код, я нашел это:


Если stdin это не TTY, то mgeneratejs предполагается, что stdin это канал, и пытается прочитать из него. Это неправильно, они должны, по крайней мере, проверить, был ли шаблон указан в аргументах командной строки.

Я бы не рекомендовал вам исправлять mgeneratejs , но я могу порекомендовать вам сделать это: