Если Вы знаете наверняка, что некоторый символ никогда не будет происходить в первом файле затем, можно использовать вставку.
Пример вставки с помощью вкладки разделителя по умолчанию:
paste file1 file2 | while IFS="$(printf '\t')" read -r f1 f2
do
printf 'f1: %s\n' "$f1"
printf 'f2: %s\n' "$f2"
done
Пример использования вставки @
:
paste -d@ file1 file2 | while IFS="@" read -r f1 f2
do
printf 'f1: %s\n' "$f1"
printf 'f2: %s\n' "$f2"
done
Обратите внимание, что это достаточно, если символ, как гарантируют, не произойдет в первом файле. Это вызвано тем, что read
проигнорирует IFS
при заполнении последней переменной. Итак, даже если @
происходит во втором файле, он не будет разделен.
Пример вставки, использующей некоторые функции удара для возможно более чистого кода:
while IFS=$'\t' read -r f1 f2
do
printf 'f1: %s\n' "$f1"
printf 'f2: %s\n' "$f2"
done < <(paste file1 file2)
Функции Bash использовали: струна до ansi ($'\t'
) и замена процесса (<(...)
) избегать цикла с условием продолжения в проблеме подоболочки.
Если Вы не можете быть уверены, что любой символ никогда не будет происходить в обоих файлах затем, можно использовать дескрипторы файлов.
while true
do
read -r f1 <&3 || break
read -r f2 <&4 || break
printf 'f1: %s\n' "$f1"
printf 'f2: %s\n' "$f2"
done 3
Не протестированный очень. Мог бы повредиться на пустых строках.
Дескрипторы файлов номер 0, 1, и 2 уже используются для stdin, stdout, и stderr, соответственно. Дескрипторы файлов от 3 и (обычно) свободны. Руководство удара предупреждает от использования дескрипторов файлов, больше, чем 9, потому что они "используются внутренне".
Обратите внимание, что открытые дескрипторы файлов наследованы для окружения функций и внешних программ. Функции и программы, наследовавшие открытый дескриптор файла, могут читать из (и записать в), дескриптор файла. Необходимо заботиться для закрытия всех дескрипторов файлов, которые не требуются прежде, чем назвать функциональную или внешнюю программу.
Вот та же программа как выше с фактической работой (печать) разделена от метаработы (читающий линию за линией из двух файлов параллельно).
work() {
printf 'f1: %s\n' "$1"
printf 'f2: %s\n' "$2"
}
while true
do
read -r f1 <&3 || break
read -r f2 <&4 || break
work "$f1" "$f2"
done 3
Теперь мы притворяемся, что не имеем никакого контроля над кодом работы и что код, по любой причине, пытается читать из дескриптора файла 3.
unknowncode() {
printf 'f1: %s\n' "$1"
printf 'f2: %s\n' "$2"
read -r yoink <&3 && printf 'yoink: %s\n' "$yoink"
}
while true
do
read -r f1 <&3 || break
read -r f2 <&4 || break
unknowncode "$f1" "$f2"
done 3
Вот вывод в качестве примера. Обратите внимание, что вторая строка из первого файла "украдена" от цикла.
f1: file1 line1
f2: file2 line1
yoink: file1 line2
f1: file1 line3
f2: file2 line2
Вот то, как необходимо закрыть дескрипторы файлов прежде, чем назвать внешний код (или любой код в этом отношении).
while true
do
read -r f1 <&3 || break
read -r f2 <&4 || break
# this will close fd3 and fd4 before executing anycode
anycode "$f1" "$f2" 3<&- 4<&-
# note that fd3 and fd4 are still open in the loop
done 3
Это еще не близко к быть определенным ответом. Вместо этого это - ряд предложений слишком долго для вписываний в комментарии.
Я боюсь, что Вы могли бы немного неправильно истолковать значения sysfs cpufreq параметры. Например, на моем Базовом ноутбуке Duo, related_cpu
параметры для обоих чтений ядер 0 1
- который, согласно Вашей интерпретации, означал бы, что ядра не могут переключить частоты независимо. Но дело не в этом - я могу установить каждую частоту по желанию. В отличие от этого, affected_cpus
параметр для каждого ядра перечисляет только соответствующее число ЦП.
Вы могли бы хотеть смотреть на документацию ядра для частоты CPU для получения лучшего понимания параметров такой как affected_cpus
,related_cpus
,scaling_*
и cpuinfo_*
. Документация обычно распределяется с исходными пакетами ядра. А именно, я рекомендую читать <kernel-sources-dir>/Documentation/cpu-freq/user-guide.txt
, где <kernel-sources-dir>
обычно обозначал бы /usr/src/linux
или /usr/src/linux-<kernel-version>
. (Однако, когда я скольжу через документацию сам теперь, я признаюсь, что не ловлю некоторые связанные с частотным масштабированием нюансы. Чтобы полностью понять их, вероятно, нужно получить основательное понимание архитектур ЦП сначала.)
Назад к Вашему вопросу. И еще один тестовый сценарий с моей стороны: когда я изменяю значение scaling_max_freq
(с также userspace
или performance
используемый регулятор), часы ядра автоматически переключаются на тот новый максимум. Другое поведение, которое Вы наблюдаете, могло бы быть любым из:
cpufreq
модуль и phc-intel
который я использую,cpufreq
модуль, который изменился в какой-то момент с тех пор 2.6.35
(моя текущая версия ядра 3.6.2
),cpufreq
реализация для Вашего ЦП (или все семейство),performance
Регулятор ЦП с 2.6.35
.Некоторые вещи Вы могли бы сделать для продвижения расследования далее:
user-guide.txt
и скрипка больше с другим cpufreq
параметры,Если Вы продолжаете испытывать неожиданное поведение и получать больше причин полагать, что это происходит из-за ошибки (определенно должен свериться с последней незначительной версией ядра), разрешение, и сообщите об этом относительно kernel.org Bugzilla.