#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//[
Как я могу заставить процесс (mgeneratejs) запускаться в фоновом режиме при использовании Bash 5.x?
rn ']}" amp;
done
echo "Waiting"
wait
echo "Finished"
Комментарии:
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
, но я могу порекомендовать вам сделать это: