Bash: как передать команду с несколькими результатами, генерируемыми одной подкомандой - PullRequest
4 голосов
/ 15 января 2009

Я хочу обработать каждый файл исходного кода после предварительной обработки:

myprocess `gcc -E file1.c`  
myprocess `gcc -E file2.c`  
...  
myprocess `gcc -E fileN.c`  

Это утомительно, так как мне сделать эту команду единственной?
То есть что-то вроде:

myprocess SOMETHINGMAGIC(gcc -E file*.c)

Заранее спасибо!

Ответы [ 6 ]

5 голосов
/ 15 января 2009

Вы имеете в виду, как

   for i in file*.c ; do
        myprocess `gcc -E $i`
    done
2 голосов
/ 15 января 2009

Если это часть текущих процессов (в отличие от одноразовых), используйте make, это хорошо для автоматизации рабочих конвейеров.

В частности, используйте суффиксные правила с неявными правилами традиционного make или gmake.

Вот схема реализации суффиксного правила:

.c.cpre:
         $(CC) -E $(CPPFLAGS) -o $@ $<
.cpre.cmy:
         $(MY_PROCESS) $<
         # Or whatever syntax you support..
         #
         # You could 
         # $(RM) $<
         # here, but I don't recommend it
.cmy.o:
         $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
         # $(RM) $<
1 голос
/ 15 января 2009

Никакой магии, просто

my_process $(gcc -E *.c)

Обратите внимание, что я использовал форму $ (command), потому что обратные галочки не рекомендуется.

В качестве отступления: вы уверены, что хотите сделать это ? Вы помещаете весь вывод gcc -E в качестве параметров командной строки my_process. Не уверен, что это то, что вы хотите. Может быть, вы хотите использовать простую трубу

gcc -E file.c | my_process

, чтобы вывод gcc стал входом my_process.

В последнем случае что-то вроде

for c_file in *.c ; do
    gcc -E $c_file | myprocess > ${c_file}.processed
done

сделает трюк.

1 голос
/ 15 января 2009

Возможно, это то, что вы ищете?:

for i in file*.c ; do 
    echo "Header for myprocess: $i" 
    gcc -E $i 2>&1 
done | myprocess 

2>&1 предполагает, что вы тоже хотите захватить stderr
echo ... дает myprocess отправную точку для каждой компиляции

0 голосов
/ 04 марта 2010

ls файл * .c | xargs - заменить myprocess $ (gcc -E {})

0 голосов
/ 15 января 2009

Как насчет:

myprocess {$(gcc -E file1.c),$(gcc -E file2.c),$(gcc -E file3.c)}

Или, если вы трубите это:

{$(gcc -E file1.c),$(gcc -E file2.c),$(gcc -E file3.c)} | myprocess

Прошло много времени с тех пор, как я использовал bash, поэтому, пожалуйста, укажите на мои ошибки!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...