Как сделать compasiosn с плавающей запятой в операторе if в параллельном блоке GNU? - PullRequest
0 голосов
/ 02 июня 2018

Я хочу запустить пакетный процесс параллельно.Для этого я передаю список parallel.Когда у меня есть оператор if, который сравнивает два числа с плавающей запятой (в форме здесь ), код больше не выполняется.Как это можно решить.

LIMIT=25

ps | parallel -j2 '   
    echo "Do stuff for {} to determine NUM"    
    NUM=33.3333 # set to demonstrate

    if (( $(echo "$NUM > $LIMIT" | bc -l) )); then
        echo "react..."
    fi

    echo "Do stuff..."
    '

Отпечатки:

Do stuff for \ \ PID\ TTY\ \ \ \ \ \ \ \ \ \ TIME\ CMD to determine NUM
Do stuff...
(standard_in) 2: syntax error
#... snipp

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Хотя GNU Parallel разработан для правильной работы с командами, занимающими несколько строк, мне лично трудно это читать.Я предпочитаю использовать функцию:

doit() {
  arg="$1"
  echo "Do stuff for $a to determine NUM"    
  NUM=33.3333 # set to demonstrate

  if (( $(echo "$NUM > $LIMIT" | bc -l) )); then
      echo "react..."
  fi

  echo "Do stuff..."
}
export -f doit

LIMIT=25
export LIMIT

ps | parallel -j2 doit

Вместо экспорта вы можете использовать env_parallel:

ps | env_parallel -j2 doit

Если ваша среда слишком велика, перед запуском используйте env_parallel --session:

#!/bin/bash

env_parallel --session

# Define functions and variables _after_ running --session
doit() {
  [...]
}
LIMIT=25

ps | env_parallel -j2 doit
0 голосов
/ 03 июня 2018

LIMIT не устанавливается внутри параллельной оболочки.Выполнение echo "$NUM > $LIMIT" | bc -l расширяется до echo "123 > " | bc -l, что приводит к синтаксической ошибке, сообщаемой bc.Вам нужно экспортировать / передать / поместить это значение в оболочку, запущенную изнутри параллельно.Попробуйте это:

LIMIT=25
ps | parallel -j2 '   
    LIMIT="'"$LIMIT"'"
    echo "Do stuff for {} to determine NUM"    
    NUM=33.3333 # set to demonstrate

    if (( $(echo "$NUM > $LIMIT" | bc -l) )); then
        echo "react..."
    fi

    echo "Do stuff..."
    '

Или лучше использовать env_parallel , предназначенный для таких задач.

Примечание: Параллельная GNU была разработана для выполнения заданийпараллельно, используя один или более компьютеров.Для сценариев, запускаемых на одном компьютере, лучше придерживаться команды xargs, которая более доступна (поэтому вам не нужно устанавливать какой-либо пакет при каждом перемещении сценария на другой компьютер).

...