Параллельное наследование переменной среды GNU при выполнении локального скрипта

Предположим, у меня есть foo.sh, который вызывает bar.sh, используя параллель:

# foo.sh

#! /bin/bash

parallel -N 3 bar.sh ::: $(seq 10)

Мой bar.sh работает следующим образом: если установлена ​​переменная среды (например, DEBUG=1), она выводит много отладочной информации.

В идеале я хочу просто выполнить свой foo.sh следующим образом:

$ DEBUG=1 foo.sh

Обычно foo.sh имеет значение $DEBUG, а bar.sh его видит. Но теперь, когда я использую параллель GNU для вызова bar.sh, которая является локальной программой, моя bar.sh больше не имеет установленного значения DEBUG.

Я читал, что --env работает только в том случае, если у меня установлено удаленное выполнение -S, и, судя по моим попыткам, это не работает для меня.

Есть ли способ заставить мой параллельный bar.sh просто «унаследовать» настройки среды моего foo.sh? Я действительно не хочу указывать каждую переменную среды и их значения при параллельном вызове bar.sh.

ТИА


person Stephen Chu    schedule 05.08.2016    source источник
comment
Это #!/bin/bash, а не $!/bin/bash.   -  person chepner    schedule 05.08.2016


Ответы (2)


Вы ищете env_parallel, который делает именно это.

Поместите это в $HOME/.bashrc:

  . `which env_parallel.bash`

Например. при выполнении:

  echo '. `which env_parallel.bash`' >> $HOME/.bashrc

псевдонимы

  alias myecho='echo aliases'
  env_parallel myecho ::: work
  env_parallel -S server myecho ::: work
  env_parallel --env myecho myecho ::: work
  env_parallel --env myecho -S server myecho ::: work

функции

  myfunc() { echo functions $*; }
  env_parallel myfunc ::: work
  env_parallel -S server myfunc ::: work
  env_parallel --env myfunc myfunc ::: work
  env_parallel --env myfunc -S server myfunc ::: work

переменные

  myvar=variables
  env_parallel echo '$myvar' ::: work
  env_parallel -S server echo '$myvar' ::: work
  env_parallel --env myvar echo '$myvar' ::: work
  env_parallel --env myvar -S server echo '$myvar' ::: work

массивы

  myarray=(arrays work, too)
  env_parallel -k echo '${myarray[{}]}' ::: 0 1 2
  env_parallel -k -S server echo '${myarray[{}]}' ::: 0 1 2
  env_parallel -k --env myarray echo '${myarray[{}]}' ::: 0 1 2
  env_parallel -k --env myarray -S server echo '${myarray[{}]}' ::: 0 1 2

env_parallel является частью GNU Parallel 20160722. Это бета-версия, поэтому сообщайте об ошибках, если вы их обнаружите.

Если вы знаете свой UNIX, вы знаете, что вы не можете использовать псевдонимы, неэкспортируемые функции, неэкспортируемые переменные и неэкспортируемые массивы в оболочках, запускаемых из текущей оболочки (например, в bash -c); и особенно если оболочка удалена (например, ssh server myalias). С env_parallel это общепринятое знание должно быть изменено на: вы не можете сделать это без обмана.

person Ole Tange    schedule 05.08.2016
comment
Я столкнулся с проблемой при попытке установить последнюю версию parallel: The signature on parallel-20160722.tar.bz2 is wrong. Но мой (wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash пытался загрузить 2016-08-08. - person Stephen Chu; 08.08.2016
comment
Следуйте инструкциям по личной установке в git.savannah.gnu.org/cgit/ parallel.git/tree/README - person Ole Tange; 08.08.2016

Чтобы скопировать всю среду, используйте _ в качестве переменной, экспортируемой --env:

parallel --env _ -N 3 bar.sh ::: $(seq 10)
person chepner    schedule 05.08.2016