Как объявить -A MYASSOCIATIVEARRY глобально?

modinfoпо умолчанию выполняет поиск в /lib/modules/<kernel-version>. Таким образом, вам придется скопировать модуль ядра в подкаталог. Скорее всего /lib/modules/<kernel-version>/extra.

Скопировав свой модуль в нужное место, вы также должны выполнить depmod -a.

0
26.11.2019, 22:50
1 ответ

Проблема, которую вы видите, не имеет ничего общего с объявлением переменной. Это потому, что вы устанавливаете переменную в подоболочке и ожидаете, что ее значение (s )будет доступно в родительском.

Вы можете увидеть этот эффект здесь, используя ту же структуру, что и ваш код, но на гораздо более простом примере:

a=""
echo find | while read item; do a="$item"; done
echo "a=$a"

К счастью, при использовании bashесть быстрое решение: переписать код в другой форме:

a=""
while read item; do a="$item"; done < <( echo find )
echo "a=$a"

В реальном коде используйте while IFS= read -r item, чтобы убедиться, что itemполучает необработанный ввод. Я опустил средства защиты для ясности в примерах.


В комментариях к этому ответу вы просили исправленную версию вашего кода. Я не могу проверить это, поэтому я не решался разместить его здесь, но он должен выглядеть так:

#!/bin/bash
#
declare -gA HOSTS_START_MAP
while IFS= read -r HOST_START_LINE; do
    if [[ $HOST_START_LINE =~ (.*)(DEBUG)(.*)(STARTING HOST)([ 0-9]*)(.*)(CALCULATION) ]]
    then
        HOST_START_TIME=$(echo "${BASH_REMATCH[1]}" | xargs)
        HOST_NAME=$(echo "${BASH_REMATCH[6]}" | xargs)
        # echo ">$HOST_NAME<... >$HOST_START_TIME<"
        HOSTS_START_MAP[$HOST_NAME]=$HOST_START_TIME
        # echo $HOST_NAME --- ${HOSTS_START_MAP[$HOST_NAME]}
    fi
done < <( find "$TEMP" -type f -name "debug.log*" -exec grep -F "STARTING HOST " {} \; )

echo ${#HOSTS_START_MAP[@]}
for MYKEY in "${!HOSTS_START_MAP[@]}"; do echo $MYKEY --- ${HOSTS_START_MAP[@]}; done
1
28.01.2020, 02:38

Теги

Похожие вопросы