Как сделать функцию доступной для команды `parallel` (GNU)?

В конце концов, я собрал его из исходников.

AFAIK, установщики могут иметь дело только со стандартными, предопределенными местоположениями для исполняемых файлов, и если вам нужно несколько версий одних и тех же инструментов, вам лучше собрать их в / usr / local /.

7
20.03.2016, 23:19
2 ответа

В основном у вас есть три варианта:

  1. export -f (это функция, не относящаяся к POSIX bash )
  2. Выполнение оболочки, определяющей функцию при каждом вызове
  3. Переместите функцию в сценарий оболочки и запустите его вместо этого

Вариант 1, вероятно, проще всего продемонстрировать, поэтому я покажу его:

$ f() { num=$1; echo "$num is an integer"; }
$ export -f f
$ cat Commands.txt 
number=1; f "$number" 
number=2; f "$number" 
number=3; f "$number" 
number=4; f "$number" 
number=5; f "$number" 
$ parallel :::: Commands.txt
1 is an integer
2 is an integer
3 is an integer
4 is an integer
5 is an integer

Обратите внимание, что ваша популяция Commands.txt , скорее всего, ошибочна, вам нужно f "$ number" в Commands.txt , чтобы передать номер, а не ] f число , которое передало бы буквальную строку «число». Ваш скрипт для его генерации должен выполнять echo "number = $ i; f \" \ $ number \ "" (обратите внимание на escape-символы, которые важны, чтобы избежать интерпретации $ number в echo время или " с завершающей строки).

6
27.01.2020, 20:17

Bash может экспортировать функции через переменные среды.

export -f f

Обратите внимание, что это функция bash, недоступная в других оболочках семейства sh.

Как вариант, можно сделать функцию скриптом. Сценарии и функции имеют одинаковый синтаксис, за исключением строки определения функции.

#!/bin/bash
num="${!1}"; echo $num is an integer;

Если вы это сделаете, вам нужно будет экспортировать переменную, которую вы передаете скрипту: строки в Command.txt должен будет выглядеть как

export number=1; f number

или

number=1 f number
2
27.01.2020, 20:17

Теги

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