Проверьте, запущен ли PHP скрипт, и если нет, запустите его

Это предоставляет одну строку в качестве аргумента для foo :

foo "${ENV_VAR_1} ${ENV_VAR_2}"

Поскольку $ 1 не в кавычках, оболочка выполняет разделение слов и, следовательно, предоставляет три аргумента для bar :

bar $1

Разделение слов выполняется для любых символов IFS в S1 . Первоисточник этих персонажей не рассматривается.

Более простой пример

Определим x как:

$ x="${ENV_VAR_1} ${ENV_VAR_2}"

Теперь напечатайте "$ x" :

$ printf "%s\n" "$x"
1 2 3

Как видите, "$ x " интерпретируется как один аргумент. Напротив, рассмотрим:

$ printf "%s\n" $x
1
2
3

В приведенном выше разделении слов выполняется $ x , создавая три аргумента.

Строки оболочки не имеют никакого представления об истории. Строка x не имеет записи о том, что 2 3 является частью одной строки до того, как было присвоено x . Строка x состоит только из 1 , пробела, 2 , пробела и 3 , а разделение слов действует на пробелы.

Альтернатива: выбор собственного IFS

Это дает результат, который вам нужен:

$ foo() ( IFS=@;  bar $1; )
$ foo "${ENV_VAR_1}@${ENV_VAR_2}"
1 test 2 3

В foo мы устанавливаем IFS на @ . Следовательно, все последующее разделение слов выполняется с использованием @ в качестве разделителя слов. Итак, при вызове foo мы помещаем @ в любое место, в котором мы хотим разделить слова.

2
26.10.2015, 03:05
1 ответ

Немного поздно для стороны ...

Используя демон restartd, вы можете для запуска программ и сценариев bash. Restartd будет проверять каждые 20 секунд (настраивается), запущены ли программы из его списка.

См. Страницу руководства здесь

0
27.01.2020, 22:21

Теги

Похожие вопросы