2016-10-10 3 views
1

Я пытаюсь получить GNU parallel для чтения в файле и загрузки из него переменных BASH, а затем выполнить некоторые действия над ними.Как получить GNU параллельно переменным нагрузки

Например:

foo=bar 
var=blah 

Однако, когда я пытаюсь либо с помощью "источника" или:

ls -1 build*/*.properties | parallel source {}; echo "var set to: $foo"; 

Где каждый из * .properties файлов вида "" для загрузки переменных в файл в виде переменных Bash, установка переменных из файла не работает.

$ ls -1 build*/*.properties | parallel source {} ; echo "variable set to $foo"; 
variable set to 

Может ли кто-нибудь сказать мне, что я здесь делаю неправильно? Я знаю, что должен быть простой способ сделать это.

+0

Что вам нужно или нужно делать с переменными? –

+0

Переменные определяют, какой «сервис» следует развернуть. Таким образом, он должен проходить через все подкаталоги с файлом * .properties, загружать их вары, включая «имя_службы», а затем для каждого из них «развернуть имя службы». – srkiNZ84

ответ

2

Первую ошибку является то, что это:

ls -1 build*/*.properties | parallel source {}; echo "var set to: $foo"; 

интерпретируется Bash как:

ls -1 build*/*.properties | parallel source {} 
echo "var set to: $foo"; 

который явно не то, что вы хотите.

Улучшение заключается в том, чтобы процитировать;

ls -1 build*/*.properties | parallel "source {}; echo var set to: $foo"; 

Но это все еще не так, потому что переменные интерполируются в двойных кавычках. Поэтому GNU Parallel не видит строку $ foo. Bash заменяет $ foo содержимым $ foo до запуска GNU Parallel. Таким образом, мы должны заставить Bash не заменить $ Foo со значением $ Foo:

ls -1 build*/*.properties | parallel 'source {}; echo "var set to: $foo"'; 

Или просто как хорошее:

ls -1 build*/*.properties | parallel source {}\; echo \"var set to: \$foo\" 

Если найти процитировать является hazzle, а затем использовать функцию Bash :

mybuild() { 
    source "$1" 
    echo "var set to: $foo" 
} 
export -f mybuild 
ls -1 build*/*.properties | parallel mybuild {} 
# or shorter: 
parallel mybuild ::: build*/*.properties 
+0

Спасибо! Это работает для меня.Не могу поверить, просто поместив одинарные кавычки вокруг команды, заставив команду «source» работать. – srkiNZ84

+0

Вы понимаете, почему? –

+0

Хмм .... не знаю, если честно. Это как-то связано с одиночными или двойными кавычками и с тем, как они относятся к Bash? – srkiNZ84

1

parallel - это программа, а не встроенная команда, поэтому она будет источником ваших переменных в порядке, но только в ее контексте.

Переменные не распространяются на родительский процесс, поэтому вы просто не можете этого сделать.

Вы застряли с непараллельной версией, которая

for i in build*/*.properties 
do 
    source $i 
done 

(примечание: тот же проблемой, если вы делаете source $i &: другой процесс создаются, и вы потеряете результат)

+0

Спасибо за это! Будет ли это работать, если я изменил логику, чтобы просто быть скриптом bash, который принимает аргумент (путь к файлу свойств), а скрипт bash загружает переменные и запускает команду? Это должно означать, что он запускается в том же контексте, нет? – srkiNZ84

Смежные вопросы