Совместное сопоставление выходных данных на самом деле не двойственно tee
. tee
делает несколько копий своих входных данных, в то время как сопоставление выходных данных не требует объединения данных.
Чтобы объединить источники вывода, просто перенаправьте их все на один и тот же файловый дескриптор. Чередование источников в целом несколько непредсказуемо, но достаточно небольшие записи в канал гарантированно будут атомарными .(Способность различать границы со стороны чтения — это отдельная история .)
{ data_source_1 &
data_source_2 &
wait; } >merged_output
Если вы получаете входные данные от нескольких файловых дескрипторов и хотите их объединить, пропустите каждый из них.
{ cat <&3 & cat <&4 & wait; } >merged_ouput
Но обычно вы можете перенаправить все файловые дескрипторы в одно и то же место назначения.
… 3>merged_ouput 4>&3
Ваша опция -n
принимает аргумент, поэтому вам нужно getopts 'n:' arg
.
Аргумент option можно найти в $OPTARG
.
Не трогайте OPTIND
в цикле while getopts
.
После цикла shift "$(( OPTIND - 1 ))"
. Это оставляет имена файлов в позиционных параметрах.
То есть,
#!/bin/sh
level=5
while getopts 'n:' arg; do
case $arg in
n) level=$OPTARG ;;
*) echo 'Error in command line parsing' >&2
esac
done
shift "$(( OPTIND - 1 ))"
for name do
# stuff
done
Далее, вы никогда не обрабатываете случай отсутствия входных файлов.
Следующее заставит сценарий использовать стандартный ввод в качестве имени файла, если он не указан:
if [ "$#" -eq 0 ]; then
# handle no filenames, for example:
set -- /dev/stdin
fi
for name do
# stuff
done
Остальное я оставлю вам (, но я настоятельно рекомендую убрать sort
из awk
и запустить его как отдельный этап в конвейере для ясности ).