У меня есть несколько предложений, поэтому я решил написать ответ.
Существует несоответствие относительно primary_mappings.txt
и secondary_mappings.txt
, которые называются primary-mappings.txt
и secondary-mappings.txt
в сценарии. Вы, конечно, должны переименуйте файлы (или измените их имя скриптом ).
Я бы создал две функции для регистрации в STDERR и выхода из программы. Это имеет то преимущество, что лучше читается, менее подвержено ошибкам и позволяет вам выходить из вызовов функций (он отвечает У меня нет механизма для выхода из сценария оболочки):
trap "exit 1" TERM
export TOP_PID=$$
log_error () {
echo "$1">&2;
}
log_error_and_exit () {
echo "$1">&2;
kill -s TERM $TOP_PID
}
Кажется, вы хотите протоколировать ошибки в STDERR, но иногда пишете в STDOUT. Предполагая, что вы просто забыли пару >&2
, их легко стандартизировать, используя наши недавно созданные функции:
а.
[ -z "$clientid" ] && { echo "cannot find clientid for $(hostname -f)"; exit 1; }
становится:
[ -z "$clientid" ] && { log_error_and_exit "Cannot find ClientID for $(hostname -f)"; }
б.
*) echo "unknown host: $(hostname -f), exiting." && exit 1 ;;
становится:
*) log_error_and_exit "Unknown host: $(hostname -f), exiting." ;;
Вы, кажется, забыли это сделать:
If for whatever reason, I cannot find either primary or secondary files for that clientid from that file, then I will exit from shell script and log an error message.
mappingsByClientID () {
id=$1 # 1 to 5
file=$path/${mapfiles[$2]} # 0 to 1
if [[ $(< $file) != *" $1="* ]]; then
log_error_and_exit "ClientID $1 out of range for $file";
fi
arr=($(sed -r "s/.*\b${id}=\[([^]\]+).*/\1/; s/,/ /g" $file))
echo "${arr[@]}"
}
Сейчас вы этого не делаете:
if for whatever reason, I cannot find those files then I want to exit from the shell script with message that tells me what files are missing.
Так как вы exit
как только обнаружите, что пропавший файл, вы никогда не получите сообщения более чем об одном файле! Решение состоит в том, чтобы создать переменную для отслеживания состояния ошибки,и проверьте его в конце проверки:
# this is for verification to see all files got copied or not
# in primary and secondary folder
set -- "$primary" "$secondary"
typeset -n array
errors=false
for array in pri snd; do
for num in "${array[@]}"; do
name="hello_monthly_${num}_999_1.data"
if [ ! -f "$1/$name" ]; then
{ log_error "$name not found in $1" && errors=true; }
fi
done
shift
done
if [ "$errors" = true ]; then
exit 1
fi
Точкой входа завершения является функция _main_complete
. Он вызывает хук compprefuncs
после установки опций оболочки и переменных, связанных с завершением -, и перед анализом настроек отображения завершения и выполнением завершений. Он вызывает ловушку comppostfuncs
непосредственно перед нормальным возвратом, независимо от того, были ли найдены завершения или нет, но не перед возвратом по прерыванию клавиатуры(Ctrl + C).
Каждая ловушка представляет собой массив имен функций; функции вызываются по порядку, и их статус возврата игнорируется. _main_complete_
стирает массив перед вызовом функций, поэтому им нужно повторно -вставить себя.
Я использую модульzsh/terminfo
для отображения индикатора в правом нижнем углу строки. Доработка стирает этот индикатор, по крайней мере в той конфигурации, которую я тестировал.
zmodload zsh/terminfo
function set_completion_indicator {
echoti sc # save_cursor
echoti cup $((LINES - 1)) $((COLUMNS - $#1)) # cursor_position
echoti setaf $2 # set_foreground (color)
printf %s $1
echoti sgr 0 # exit_attribute_mode
echoti rc # restore_cursor
#sleep 1
}
completion_indicator_text='(completing)'
completion_indicator_color=3
function display_completion_indicator {
compprefuncs+=(display_completion_indicator)
set_completion_indicator $completion_indicator_text $completion_indicator_color
}
function hide_completion_indicator {
comppostfuncs+=(hide_completion_indicator)
# The completion code erases the indicator, so there's nothing to do.
}
compprefuncs+=(display_completion_indicator)
comppostfuncs+=(hide_completion_indicator)