Параллельно: как ссылаться на несколько аргументов из функции - PullRequest
0 голосов
/ 01 июня 2018

У меня есть эта функция, и мне нужно, чтобы она ссылалась на несколько аргументов из функции, используя параллельную GNU.

foo () {

    cd ${HOME}/sh/xxx/xxx/xxx/folder_with_scripts
    bash -H $1 #replace with echo in test run {echo $1 is being echoed}
    bash -H $2 #replace with echo in test run {echo $2 is being echoed}
}

export -f foo
parallel foo ::: *script.sh bash*.sh

folder_with_scripts content

$ ls
firstscript.sh
secondscript.sh
thirdscript.sh
bashhim.sh
bashscript.sh
bashher.sh

parallel foo в основном выполняет все сценарии, следующие*script.sh внутри, ссылаясь на него как на аргумент внутри foo.Что $1.Я пытаюсь сделать так, чтобы он также выполнял bash*.sh*, находящиеся внутри каталога folders_with_scripts, используя $2.

Согласно man parallel, синтаксис:

 parallel [options] [command [arguments]] ( ::: arguments | :::: argfile(s) )

Поскольку ::: arguments во множественном числе, я предполагаю, что это очень возможно.

результат

Для удобства я заменяю bash на echo

$ ./foo.sh
firstscript.sh is being echoed
secondscript.sh is being echoed
thirdscript.sh is being echoed
              is being echoed
              is being echoed
              is being echoed

желаемый результат

firstscript.sh is being echoed
secondscript.sh is being echoed
thirdscript.sh is being echoed
bashhim.sh is being echoed
bashscript.sh is being echoed
bashher.sh is being echoed

В моем случае parallel foo ::: *.sh не будет его сокращать.

Менять позиции $1 на *script.sh не будетотрежь

1 Ответ

0 голосов
/ 01 июня 2018

Ваш вопрос не содержит MVCE https://stackoverflow.com/help/mcve В частности, я не могу запустить ваш код непосредственно в моей системе.Таким образом, этот ответ основан на моём наилучшем предположении о том, что, я думаю, вы пытаетесь сделать.

Предполагая, что вы хотите запустить все bash*.sh для каждого *script.sh:

parallel foo ::: *script.sh ::: bash*.sh

Есликаждый bash*.sh связан с *script.sh (:::+ представлен в версии 20160422):

parallel foo ::: *script.sh :::+ bash*.sh

Проверьте его с помощью --dry-run:

parallel --dry-run foo ::: *script.sh ::: bash*.sh
parallel --dry-run foo ::: *script.sh :::+ bash*.sh

Если это такне отвечайте на ваш вопрос, обновите вопрос, указав, какие команды вы хотите запустить GNU Parallel, например:

foo firstscript.sh bashhim.sh
foo secondscript.sh thirdscript.sh
foo bashscript.sh bashher.sh

и покажите вывод echo *script.sh bash*.sh в директории, в которой вы запускаете parallel.

Данные, стоящие за :::, называются источником ввода.Работа с источниками входного сигнала описана в главе 4 https://zenodo.org/record/1146014 (напечатано: http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html)

...