2012-05-18 3 views
1

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

#!/bin/sh 

for i in $(ls src) 
do 
    f=${i%.*} 
    echo 'first bit' > dist/$i.htm 
    perl myScriptThatOutputsSecondBit.pl >> dist/$i.htm 
    echo 'third bit' >> dist/$i.htm 
done 

ответ

3

Использование compound/group Команда:

Чтобы запустить его в текущей скорлупе,

{echo 'first bit';perl myScriptThatOutputsSecondBit.pl;echo 'third bit';} > dist/$i.htm 


Чтобы запустить его в суб-оболочки,

(echo 'first bit';perl myScriptThatOutputsSecondBit.pl;echo 'third bit') > dist/$i.htm 
+0

Спасибо большое :) – m09

0

Написать простая лог-функция, это было бы более эффективно. например

log(){ 
    echo $1 >> dist/$i.htm 
} 

, а затем вызвать его из сценария:

for i in $(ls src) 
do 
    f=${i%.*} 
    log 'first bit' 
    perl myScriptThatOutputsSecondBit.pl >> dist/$i.htm 
    log 'third bit' 
done 
+0

Как бы это было более эффективным? – m09

+0

Эффективность отложена, вы повторяете путь дважды, что именно то, чего я хотел избежать – m09

+0

Эффективный в смысле логически, и код выглядит более модульным. Ответ Джона идеально подходит для этого случая, но что делать, если у вас длинный и сложный сценарий оболочки с множеством таких эхо-заявлений? Вы будете группировать 100 команд и перенаправлять вывод всех в конце? – mtk

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