Я читал, что скрипты, которые вызывают подоболочку, работают медленно, что объясняет, почему мой скрипт медленный.
например, здесь, где я запускаю цикл, который получает число из массива, каждый раз запускает подоболочку, и можно ли это решить без использования подоболочек?
mmode=1
modes[1,2]="9,12,18,19,20,30,43,44,45,46,47,48,49"
until [[ -z $kik ]];do
((++mloop))
kik=$(echo ${modes[$mmode,2]} | cut -d "," -f $mloop)
filename=$(basename "$f")
# is all these lines
xcolorall=$((xcolorall+$storednr)
# also triggering
pros2=$(echo "100/$totpix*$xcolorall" | bc -l)
IFS='.' read -r pros5 pros6 <<< "$pros2"
procenthittotal2=$pros5.${pros6:0:2}
#subshells and if,
# is it possible to circumvent it?
#and more of the same code..
done
обновлено: переменная pros2 вычисляет процент, сколько % xcolorall приходится на totpix, а переменная kik получает число из массива modes, информирующее цикл о том, какой цвет он должен считать в этом цикле. Я подозреваю, что это основные сборщики, можно ли сделать это без подоболочек?
bash
в лучшем случае используется для вызова других инструментов с соответствующими входными данными. Если вы лучше опишете свои входные данные, возможно, кто-то сможет придумать подход, который не требует этого решения для цикла bash. - person liborm   schedule 16.12.2020$(( ))
не создает подоболочку; это арифметическое выражение, анализируемое непосредственно в основной оболочке. С другой стороны,var=$(echo something | somecommand)
создает три подпроцесса: подоболочку для управления каналом, еще одну для выполненияecho
и еще одну для запускаsomecommand
.var=$(somecommand <<<"something")
создает только два (предупреждение:<<<
— это функция только для bash). - person Gordon Davisson   schedule 16.12.2020slow
(5 секунд? 4 минуты? 2,5 часа?) ... наверное зависит от того, из чего состоит#and more of the same code
;$(...)
(одинарные форзацы(
и)
) являются дополнительными оболочками;filename=$(...)
, возможно, можно было бы заменить некоторыми расширениями параметров (будет зависеть от формата$f
); вместо циклаuntil
я бы, вероятно, использовалwhile/IFS/read
для прямого анализа строки с разделителями-запятыми, тем самым исключив все вызовы подпроцесса для повторной установкиkik
- person markp-fuso   schedule 16.12.2020filename=$(...) / xcolorall=$((...)) / pros2=$(...) / loc0=$((..)
выполняются для каждого прохода через цикл; но нет никаких указаний (в предоставленном фрагменте кода), что эти назначения меняются при каждом проходе через цикл; в исходном коде я бы убедился, что эти типы назначений (2 из которых выполняют вызовы подпроцессов) перемещаются вверх/перед циклом, если их значения никогда не меняются внутри цикла - person markp-fuso   schedule 16.12.2020for i in "$@"; do echo "$i"; done
наprintf %s\\n "$@"
, чтобы дать очень упрощенный пример. Здесь, я боюсь, на самом деле нужна петля. Но если скорость имеет значение, реализуйте этот цикл на другом языке. - person Socowi   schedule 17.12.2020