Вы также можете сохранить вывод ps в переменную и записать его с помощью одного echo или printf.
DATE2=`date +%Y-%m-%d:%H:%M:%S`
PS_RESULT=`ps up 12345 --no-headers`
printf "%s: %s" "${DATE2}" "${PS_RESULT}" >> $filename
Примечание: может быть полезно привыкнуть к $ (command)
вместо `command`
, когда вы можете его использовать, поскольку этот синтаксис может быть вложенным.
Вы не так уж далеки от однострочного файла. Попробуйте массивы и избавьтесь от синтаксических ошибок:
read -a TMPARR < file
while read -n1 CH && [[ $CNT -lt ${#TMPARR[@]} ]]; do [[ "$CH" =~ [[:print:]] ]] && echo ${TMPARR[((CNT++))]}; done
Для многострочного файла попробуйте
while read -a TMPARR <&3
do CNT=0
[[ $CNT -lt ${#TMPARR[@]} ]] && read -sn1 CH
while read -sn1 CH && [[ $CNT -lt ${#TMPARR[@]} ]]
do [[ "$CH" =~ [[:print:]] ]] && echo ${TMPARR[((CNT++))]}
done
done 3< file
Вы должны разделить дескрипторы входного файла для последовательного чтения текстовых строк и параллельного чтения с терминала.