Нет необходимости в цикле оболочки:
gzip -cd $(<list.txt) | ./a.out
С опцией '-cd
' gzip распаковывает список файлов на стандартный вывод (или вы можете использовать 'gunzip -c
'). Нотация $(<file)
расширяет содержимое именованного файла в виде списка аргументов без запуска подпроцесса. Это эквивалентно $(cat list.txt)
в противном случае.
Однако, если вы чувствуете, что должны использовать цикл, просто перенаправьте вывод из цикла в один экземпляр вашей программы:
for i in `cat list.txt`
do
gunzip -c $i
done |
./a.out
Если содержимое цикла более сложное (чем простое копирование одного файла), это может быть необходимо. Вы также можете использовать перенаправление ввода-вывода '{ ... }
':
{
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
gunzip -c $i
done
} |
./a.out
Или:
{
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
gunzip -c $i
done; } |
./a.out
Обратите внимание на точку с запятой; это необходимо с брекетами. В этом примере это по сути то же самое, что и использование формальной суб-оболочки с круглыми скобками:
(
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
gunzip -c $i
done
) |
./a.out
Или:
( cat /etc/passwd /etc/group
for i in `cat list.txt`
do
gunzip -c $i
done) |
./a.out
Обратите внимание на отсутствие точки с запятой здесь; это не нужно. Снаряд чудесно окутан иногда. Перенаправление фигурных скобок может быть полезно, когда вам нужно сгруппировать команды после символа канала:
some_command arg1 arg2 |
{
first sub-command
second command
for i in $some_list
do
...something with $i...
done
} >$outfile 2>$errfile