Запустите программу с набором среды к переменным в файле

как сказанный @manatwork, это выглядит более простым и более безопасным создать новый список с допустимыми узлами.

Однако, поскольку "$nodes" оценен перед первым повторением для цикла, должно быть возможно изменить его во время того же самого цикла:

$ nodes="127.0.0.1 1.2.3.4 1.2.3.4 "
$ for node in $nodes; do
      result=$(ping -c 1 $node >/dev/null 2>/dev/null; echo $?);
      if [ "$result" -ne 0 ]; 
      then    nodes=$(echo $nodes | sed -e "s/ *$node */ /"); 
      fi;
      echo result=$result node=$node nodes=$nodes ;    
  done ;

Уведомление: моя замена sed [space]$node[space] или $node[space] или [space]$node работать во всех случаях в зависимости от положения $node в $nodes список (Если в середине, или первое или последний элемент, пространство (пространства) прежде и после того, как это будет или подарок или не). И это только заменяет 1 происшествие за один раз, но Вы могли добавить финал /g избавиться от всех происшествий сразу.

Это производит:

result=0 node=127.0.0.1 nodes=127.0.0.1 1.2.3.4 1.2.3.4
result=1 node=1.2.3.4 nodes=127.0.0.1 1.2.3.4
result=1 node=1.2.3.4 nodes=127.0.0.1
7
23.07.2014, 20:39
3 ответа

Учитывая показанный вами файл, вы должны уметь:

(set -f ; IFS='
' ; env - $(cat /path/to/file) /path/to/your/program
)

Если это не работает, то только потому, что сначала нужно отформатировать файл окружения. Вот пример:

(set -f ; IFS='
' ; env - $(cat) printenv 
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore

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

(set -f; IFS='
' ; env - $(cat) sh -c 'echo "$variable3"'
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
value3 an$d s'om\e m"ore

Тем не менее, если вы предпочитаете исходные тексты, вот как вы можете использовать оболочку:

(echo '$1'; cat; echo '$2') <<\ENV |\
env - sh -s -- 'set -a' printenv
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
###OUTPUT###
PWD=/home/mikeserv/test
SHLVL=1
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
_=/usr/bin/printenv

Обратите внимание, что я удалил $IFS - в этом нет необходимости - но я должен был получить уточнения по поводу кавычек в файле. Здесь я по существу .dot - источник stdin - читаю |pipe как входной файл - но вы можете использовать любой файл. Я использую set -a перед чтением входного файла для установки опции --allexport.

Это результат использования bash sh - он добавляет $PWD, $SHLVL и $_. С тире dash это немного лучше. И тире тоже не добавляет кучу экспортированных данных, поэтому вы можете указать параметр -a в командной строке:

(cat; echo '$1') <<\ENV |\
env - dash -sa -- printenv 
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
PWD=/home/mikeserv/test

Проходит только $PWD.

5
27.01.2020, 20:18

Все это можно сделать в Python:

$ cat config.py
env = {
    'FOO' : 'bar',
    'X'   : '12',
}

$ cat test.py
import os
import config

os.environ.clear()
os.environ.update(config.env)
print os.environ

Затем:

$ python test.py
{'X': '12', 'FOO': 'bar'}
1
27.01.2020, 20:18

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

$ cat file
FOO=bar
X=12
var=a b c

$ IFS=$'\n' read -d '' -ra vars < file
$ env -i "${vars[@]}" python env.py
{'var': 'a b c', 'X': '12', 'FOO': 'bar'}
1
27.01.2020, 20:18

Теги

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