Если вы не планируете читать что-либо из стандартного ввода после цикла, вам не нужно сохранять и восстанавливать исходный стандартный ввод (хотя приятно видеть, что вы знаете, как).
Точно так же я не вижу причины для того, чтобы пить с IFS вообще. Конечно, нет необходимости восстанавливать значение IFS перед выходом - это настоящая оболочка, которую вы используете, а не файл DOS BAT.
Когда вы делаете:
read var1 var2 var3
оболочка назначает первое поле $var1
, второе $var2
, а остальную часть строки $var3
. В случае, когда есть только одна переменная - например, ваш скрипт - вся строка переходит в переменную, как вы этого хотите.
Внутри функции строки процесса вы, вероятно, не хотите выбрасывать вывод ошибок из выполненной команды. Вы, вероятно, хотите подумать о проверке состояния выхода команды. echo
с перенаправлением ошибок ... необычно и излишне. Если вы достаточно уверены, что команды не могут завершиться с ошибкой, тогда игнорируйте ошибку. Является ли команда «болтливым»; если это так, отбросьте чат во что бы то ни стало. Если нет, возможно, вам также не нужно выбрасывать стандартный вывод.
Сценарий в целом, вероятно, должен диагностировать, когда ему дается несколько файлов для обработки, поскольку он игнорирует посторонние.
Вы можете упростить обработку файлов, используя просто:
cat "$@" |
while read line
do
processline "$line"
done
Команда cat
автоматически сообщает об ошибках (и продолжается после них) и обрабатывает все входные файлы или читает стандартный ввод, если не осталось аргументов. Использование двойных кавычек вокруг переменной означает, что она передается как единое целое (и, следовательно, не разбирается на отдельные слова).
Интересно использовать date
и bc
- я раньше такого не видел.
В общем, я бы посмотрел на что-то вроде:
#!/bin/bash
# Time execution of commands read from a file, line by line.
# Log commands and times to CSV logfile "file.csv"
processLine(){
START=$(date +%s.%N)
eval "$@" > /dev/null
STATUS=$?
END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
echo "$line, $START, $END, $DIFF, $STATUS" >> file.csv
echo "${DIFF}s: $STATUS: $line"
}
cat "$@" |
while read line
do
processLine "$line"
done