У меня есть предварительная команда процесса для вывода файла
./preprocess.sh > preprocessed_file
и preprocessed_file
будет использоваться как это
while read line
do
./research.sh $line &
done < preprocessed_file
rm -f preprocessed_file
Есть ли способ направить вывод на while read line
часть вместо вывода в preprocessed_file? Я думаю, что должен быть лучший способ, чем использовать этот темп preprocessed_file
.
shell
io-redirection
Маркус Торнтон
источник
источник
<
перенаправление, а<(...)
синтаксис замещения процесса. Вы должны прочитать: gnu.org/software/bash/manual/html_node/… для получения более подробной информации.<(...)
является частью синтаксиса.read
необходимо читать по одному байту за раз, при этом он может оптимизировать вещи с помощью чтения больших кусков и искать назад при чтении из обычного файла. Лучшеwhile read
всего вообще избегать петель, когда это возможно. Также обратите внимание, что вам нужноIFS= read -r line
прочитать строку в$line
. И оставлять без$line
кавычек (вызывая оператор split + glob) здесь, вероятно, не имеет смысла.read
встроенная оболочка читает по одному символу за раз при чтении из канала (независимо от того, что находится на другом конце канала, которыйread
не имеет возможности узнать), что является одной из причин, по которойwhile read
циклы чрезвычайно медленные.Да! Вы можете использовать технологическую трубу
|
.Канал процесса передает стандартный вывод (
stdout
) одного процесса в стандартный ввод (stdin
) следующего.При желании вы можете поставить символ новой строки после a
|
и расширить команду до следующей строки.Примечание:
a|b
эквивалентноb < <(a)
, но без волшебных файлов и в более читаемом порядке, особенно когда конвейер становится длиннее.a|b|c
эквивалентноc < <(b < <(a))
а также
a|b|c|d|e
являетсяe < < (d < <(c < <(b < <(a))))
источник
$line
на переменные, например, в двойные кавычки (например, в вашем скрипте./research.sh "$line" &
).research.sh
работает с массивом аргументов командной строки и$line
, например, «один два» с намерением, чтобы первый аргумент был «один», а второй аргумент «два», цитирование$line
сделает это невозможным - вместо этого первый аргумент будет "один два", и второго не будет ...a|b
эквивалентноb < <(a)
» - близко, но не совсем. В версии канала обе стороны канала выполняются в подоболочках, в то время как в версии подстановки процессов в подоболочке запускается только замещенный процесс, ноa
выполняется в объеме текущего выполняемого уровня оболочки. Это имеет важные последствия для объема переменных, установленных внутриa