Это происходит потому что Ваш while
цикл выполняется в подоболочке. Переменные модификации в подоболочке не влияют на родителя.
Избегайте и канала и бесполезного использования cat
путем выполнения некоторого перенаправления вместо этого:
while read line
do
let len+=${#line}
echo $len
done < $1
Это не требует подоболочки, так изменения в $len
будет видимо в родителе.
Частичный ответ:
То, что вам нужно, это программа для просмотра изображения, которая может отображать изображение, не захватывая фокусировку клавиатуры . Тогда вы можете либо убить его и повторно запустить. (Начните его на заднем плане, а $!
будет PID). Или он может прочитать список файлов для отображения из трубы или лучше, команды, такие как «отображать этот файл сейчас» с трубы, вы можете иметь постоянную трубу к ней, как одно из файловых дескрипторов.
(Я думаю, что это то, что этот вопрос: Q & A о: фоновой процесс-вход . Расширение этого, чтобы сделать новый FD в качестве FD 42, так что вы можете написать в трубу с Echo Foo> & 42
Может работать. Или, может быть, вам нужно использовать COPROC
.)
.)
Я оглянулся рядом, но не нашел никаких зрителей изображений, которые имели возможность не захватить фокус. Можно удалось добавить флаг, чтобы запросить это к существующему коду просмотра изображений и компилировать пользовательскую версию IT.