Могу ли я передать часть вывода моих сценариев bash в файл? Могу ли я передать файл и стандартный вывод?

Я почти уверен, что видел это раньше, но я не могу найти его в Google.

for file in $mydir/*
do
    #redirect the rest to $myotherdir/$file.output.
    echo this should go to the $myotherdir/$file.output.
done

Также было бы здорово, если бы я мог использовать tee вместо перенаправления, чтобы он шел к этому файлу и стандартному выводу.


person user606723    schedule 05.10.2011    source источник


Ответы (2)


Вы можете использовать любую из как минимум трех техник. Один из них проиллюстрирован ответом dtmilano с использованием полной оболочки и круглых скобок, но будьте осторожны, чтобы не стереть предыдущий вывод:

outfile=/$myotherdir/$file.output

for file in $mydir/*
do
    (
    ...commands...
    ) >> $outfile
    ...other commands with output going elsewhere...
done

Или вы можете использовать фигурные скобки, чтобы сгруппировать перенаправление ввода-вывода, не запуская подоболочку:

outfile=/$myotherdir/$file.output

for file in $mydir/*
do
    {
    ...commands...
    } >> $outfile
    ...other commands with output going elsewhere...
done

Или вы можете иногда использовать exec:

exec 1>&3    # Preserve original standard output as fd 3
outfile=/$myotherdir/$file.output

for file in $mydir/*
do
    exec 1>>$outfile
    ...standard output
    exec 1>&3
    ...other commands with output going to original stdout...
done

Обычно я бы использовал нотацию { ... }, но в сценарии с одной строкой это капризно; } должен появиться там, где может начаться команда:

{ ls; date; } >/tmp/x37

Здесь нужна вторая точка с запятой.

person Jonathan Leffler    schedule 05.10.2011

Я думаю, это то, что вы хотите

for file in $mydir/*
do
   (
     commands
     ...
   ) > /$myotherdir/$file.output
   echo this should go to the $file > $file
done
person Diego Torres Milano    schedule 05.10.2011
comment
Есть идеи, как называется эта техника? Кроме того, эхо должно быть среди команд. Нет причин делать два перенаправления. - person user606723; 05.10.2011
comment
Неважно, мой вопрос сбил с толку... вот почему вы это сделали. - person user606723; 05.10.2011
comment
@Jonathan, возможно, имел в виду строку echo this should go to the $file > $file - это усекает $file до того, как оболочка выполнит команду echo. - person glenn jackman; 05.10.2011
comment
ОК - мой плохой. Я удалю свой комментарий (ы). - person Jonathan Leffler; 05.10.2011