X входов в систему раздражающе непоследовательны, о котором используются имена файлов запуска. В системе я использую Вас, должен был бы просто изменить $HOME/.xsessionrc
. Но это действительно варьируется. Я обычно помещал свои настройки переменной среды в отдельный файл и источник это от .profile
и .xsessionrc
.
Если .xsessionrc
не работает на Вас, проверяют документацию или читают сценарии в /etc/X11/
.
Нет никакого эффективного способа параллелизировать добавлять операцию ввода-вывода; каждая строка должна быть записана в свою очередь.
В первую очередь, подтвердите узкое место производительности. Мультипоток бесполезен, если диск io является Вашим узким местом.
Если у Вас есть действительно быстрый диск или SSD, Вы можете статистика длины файлов, вычислить смещения и использовать несколько команд dd.
Как насчет сценария как это (со снами, чтобы продемонстрировать, как это параллелизирует операции):
#!/bin/bash
eval exec 3\<<(echo FIRST FILE; sleep 3)
eval exec 4\<<(echo SECOND FILE; sleep 3)
cat <&3
cat <&4
Это параллелизирует чтение входных файлов. Обратите внимание, что это ограничено во многих отношениях и не параллелизирует вывод, но это не может быть сделано так или иначе.
Вот более полный пример, который обрабатывает все файлы в текущем каталоге:
#!/bin/bash
fd=3
for file in *
do
eval exec $fd\<<(cat $file)
fd=$((fd + 1))
done
out_fd=3
while [ "$out_fd" -lt "$fd" ]
do
cat <&${out_fd}
out_fd=$((out_fd + 1))
done
Стороны выше о производительности являются положительными; существует шанс, которому это не поможет вообще.
Обновление На дальнейшем размышлении, это только выберет с упреждением до размера буфера канала, 64k. Следующая модификация вытянет все файлы в память; если они не могут соответствовать, не используйте его:
#!/bin/bash
fd=3
for file in *
do
eval exec $fd\<<(content=$(<$file); echo "$content")
fd=$((fd + 1))
done
out_fd=3
while [ "$out_fd" -lt "$fd" ]
do
cat <&${out_fd}
out_fd=$((out_fd + 1))
done