Выполнять команды из одного столбца входного файла - PullRequest
1 голос
/ 12 февраля 2020

У меня очень мало опыта работы с bash, но я пытаюсь собрать конвейер, который читает и выполняет команды построчно из входного файла. Входной файл с именем «seed.txt» настроен так:

program_to_execute -seed_value 4496341759106 -a_bunch_of_arguments c(1,2,3) ; #Short_description_of_run
program_to_execute -seed_value 7502828106749 -a_bunch_of_arguments c(4,5,6) ; #Short_description_of_run

Я отделил #Short_description от команд точкой с запятой (;), поскольку аргументы содержат запятые (,). Когда я запускаю следующий скрипт, я получаю сообщение об ошибке «Нет такого файла или каталога»

#!/bin/bash

in="${1:-seeds.txt}"

in2=$(cut -d';' -f1 "${in}")

while IFS= read -r SAMP
    do
    $SAMP 

done < $in2

Я знаю, что seed.txt читается нормально, поэтому я не уверен, почему я получаю отсутствует файл / директория сообщения. Кто-нибудь может указать мне правильное направление?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2020

Используя GNU Parallel, это выглядит так:

cut -d';' -f1 seeds.txt | parallel
1 голос
/ 13 февраля 2020

На всякий случай, если вы хотите избежать eval

while read -ra line; do command "${line[@]}"; done < <(cut -d';' -f1 seeds.txt)

Обратите внимание, что это решение не работает, если программа / утилита не является исполняемым файлом в вашем PATH, например, вы хотите использовать функцию или псевдоним. Не уверен, что решение eval может сделать это тоже. Престижность решения cut!

1 голос
/ 12 февраля 2020

вы можете попробовать, как показано ниже, с eval ... не очень безопасно, хотя, смотрите это для получения дополнительной информации

while read line; do eval "$line" ; done < <(cut -d';' -f1 seeds.txt)
...