G
G
gohellp2021-07-07 12:24:49
bash
gohellp, 2021-07-07 12:24:49

How to make it possible to output the program to the console?

There is this script:

read -p "Enter the programm's path with .js: " path
    cd "$path"
    echo "node main.js"
    nodeLogs="$(node main.js)"
      q=IFS;IFS=$'\n';nodeLogsArr=($nodeLogs);IFS="$q" #nodeLogs.split("\n")
        for logs in ${nodeLogsArr[@]}; do 
          if ; then
            echo "git pull"
            pwd="$(pwd)"
            (git pull && "/root/test \"$pwd\"")
          elif ; then
            echo "Process stopped:\n$logs"
          fi
        done

I ran into a problem: my way of getting data from the program does not allow it to output this data to the console. About eval I think, but it seems that this is not quite what I need. I definitely won’t do it through the function, because then, as far as I understand, every time I try to get the output, the program will work again.
It is necessary that the program output its text to the console and write it to a variable. Yes, I can add else to the enumeration of the array and so each line of the program will be displayed in the console, but only after the program ends. I wish she would take it out right away.
I hope for your help.
Thanks in advance

Answer the question

In order to leave comments, you need to log in

1 answer(s)
X
xotkot, 2021-07-09
@gohellp

if you need to dynamically - simultaneously output to the console, write to a file and immediately immediately analyze the incoming information line by line, then it’s a little more difficult, although not a little, here’s a small example:
working through a file

#!/usr/bin/env bash

# функции бот1 и бот2 которые постоянно выводят рандомно числа от 0 до 9 с интервалом в 2 секунды
bot1(){
  while true; do
    echo "Bot1: $[RANDOM%10]"
    sleep 2
  done
}

bot2(){
  while true; do
    echo "Bot2: $[RANDOM%10]"
    sleep 2
  done
}

# путь к лог-файлу куда будем писать логи от ботов
LOG=/tmp/botsLog.txt

# удаляем лог-файл (если ненужно то закоментирвоать)
rm -rf $LOG

# запускаем ботов в фоновом(&) режиме, 
# а также начинаем выводит поступающую от них информацию на консоль и писать в общий лог-файл
bot1 | tee -a $LOG &
sleep 1
bot2 | tee -a $LOG &

# функция анализа лог-файла (потока)
analysisLogs() {
  # запускаем постоянное построчное чтение поступающих данных в функцию
  while read -r data; do
    # здесь мы задаём фильтры и то что выполнить если совпадёт условие
    case "$data" in
      "Bot1: 0" ) echo "Бот 1 выдал ноль"
        ;;
      "Bot2: 0" ) echo "Бот 2 выдал ноль"
        ;;
    esac
  done
}

# tail выводит поступающие данные по мере роста лог-файла (мониторит)
# в данном случае мы передаём появляющиеся данные из файла в функцию analysisLogs
tail -f $LOG | analysisLogs 

# это необходимо чтобы главная программа преждевременно не завершилась 
# пока не завершаться запущенные в ней фоновые(&) потоки
wait

exit

with comments, I think it will be clearer
ctrl + c to complete the script
, of course, you can also do it through a variable, but it will not be so beautiful and not in Feng Shui , by the way, here we write in RAM, since / tmp in most distributions is mounted in RAM.
If you don’t want to write data to disk or RAM at all, since logs are usually prone to accumulation if they are not cleared or simply unnecessary, then you can simply use a named pipe (FIFO files) with which you can work like a file (read / write) but at the same time it will simply act as an intermediate buffer, for this we need to change only two lines in our program (create a named pipe and use regular cat instead of tail)
work through the fifo file
#!/usr/bin/env bash

# бот1 и бот2 просто постоянно выводят рандомно числа от 0 до 9 с интервалом в 2 секунды
bot1(){
  while true; do
    echo "Bot1: $[RANDOM%10]"
    sleep 2
  done
}

bot2(){
  while true; do
    echo "Bot2: $[RANDOM%10]"
    sleep 2
  done
}

# путь к лог-файлу куда будем писать логи от ботов
LOG=/tmp/botsLog.txt

# удаляем лог-файл
rm -rf $LOG

# создаём именованный канал (FIFO-файл)
mkfifo $LOG

# запускаем ботов в фоновом(&) режиме, 
# а также начинаем выводит поступающую от них информацию на консоль и писать в общий fifo-файл
bot1 | tee -a $LOG &
sleep 1
bot2 | tee -a $LOG &

# функция анализа поступающих данных
analysisLogs() {
  # запускаем постоянное построчное чтение поступающих данных в функцию
  while read -r data; do
    # здесь мы задаём фильтры и то что выполнить если сработает условие
    case "$data" in
      "Bot1: 0" ) echo "Бот 1 выдал ноль"
        ;;
      "Bot2: 0" ) echo "Бот 2 выдал ноль"
        ;;
    esac
  done
}

# читаем файл(FIFO-файл) и передаём появляющиеся данные в функцию analysisLogs
cat $LOG | analysisLogs 

# это необходимо чтобы главная программа преждевременно не завершилась 
# пока не завершаться запущенные в ней фоновые(&) потоки
wait

exit

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question