Инкремент l oop внутри nohup вызывает бесконечный цикл - PullRequest
0 голосов
/ 16 марта 2020

в то время как это работает в sh

i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ]
do
    i=$((i+1))
    date
done

с 5 выходными данными (export $CONTAINERS_COUNT=5)

следующее входит в бесконечность l oop

nohup sh -c " i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ]
do
    i=$((i+1))
    date
done &"

что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

Расширения внутри " работают.

С set -x это выглядит так:

$ set -x
$ nohup sh -c " i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ]
> do
>     i=$((i+1))
>     date
> done &"
+ nohup sh -c ' i=1; while [ 0 -ge 0 ]
do
    i=1
    date
done &'

Вы l oop расширены до while [ 0 -ge 0 ] до выполняет sh. Таким образом, все, что видит sh, это [ 0 -ge 0 ] - бесконечный l oop.

Я предлагаю использовать одинарные кавычки для содержимого сценария, чтобы справиться с большинством проблем цитирования и передать среду, используя экспортированную переменную или позиционные аргументы сценария:

nohup sh -c '
   CONTAINERS_COUNT=$1
   i=1;
   while (( CONTAINERS_COUNT >= i )); do
      i=$((i+1))
      date
   done
' -- "$CONTAINERS_COUNT" &

Примечание: это просто seq "$CONTAINERS_COUNT" | xargs -I{} date

0 голосов
/ 16 марта 2020

вам нужно поставить скрипт в ' кавычках.

:=>sh -c 'i=1; while [ $(( $CONTAINERS_COUNT )) -ge $(( i )) ]
do
    i=$((i+1))
    date
done &'
:=>Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020
Mon Mar 16 11:14:01 GMT 2020

Объяснение: Одиночная кавычка будет обрабатывать строку в том виде, в каком она есть. Пока двойная кавычка будет расширяться.

:=>i=4
:=>sh -c "i=5; echo $i"
4
:=>sh -c 'i=5; echo $i'
5
:=>
...