2013-07-18 3 views
0

Использование оболочки Bash в Mac OSXПроблемы с командной строки OSX шаблона

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

Сценарий выглядит следующим образом:

rm *.cs 
rm *.bin 
protoc -I. *.proto -o*.bin 
mono protogen -i:*.bin -o:*.cs 

Теперь, когда я вручаю типа в командной строке для каждого файла, он отлично работает. Однако при запуске этого сценария оболочки с использованием подстановочных знаков он завершает создание «* .bin» и «* .cs», а не отдельных .bin и .cs файлов для каждого из моих разных входов. Я неправильно использую подстановочные знаки или что-то просто странное?

+0

Подсказка: оболочка анализирует по строкам, что осталось для вас в третьей строке? :) – Jite

+0

Пожалуйста, разместите свой сценарий целиком, и вы, вероятно, получите лучший ответ. – Dan

ответ

1

попробовать что-то вроде (не проверено):

protofiles="*.proto" 
rm *.cs 
rm *.bin 
for i in $protofiles; do 
binfile=${i/.proto/.bin} 
protc -I. $i -o$binfile 
done 
binfiles="*.bin" 
for i in $binfiles; do 
csfile="${i/.bin/.cs} 
mono prtogen -i:$i -o:$csfile 
done 

... Во всяком случае, я предлагаю вам использовать Makefiles для этой работы. Попробуйте что-то вроде этого (не проверено):

CSFILES=a.cs b.cs d.cs e.cs 

clean: 
     rm *.cs *.bin 

%.bin: %.proto 
     protoc -I. $< -o [email protected] 

%.cs: %.bin 
     mono prtogen -i:$< -o:[email protected] 

all: $(CSFILES) 
+1

Ваш ответ будет еще лучше с быстрым объяснением вашего решения или проблемы, которую вы видели и решили. – Jite

2

Подстановочные знаки не работают. Они просто заменяются списком существующих совпадающих имен файлов. Так что если вы rm * .bin, то * .bin ничего не соответствует в следующем утверждении. Они не магически «захватывают» замененное значение из другого токена в той же командной строке.

В bash результатом будет то, что * .bin останется неизменным, поэтому он должен создать файл * .bin, а не .bin. Но вы можете использовать другую оболочку.

Вы можете легко выполнить эту задачу с помощью make, кстати.

Смежные вопросы