Баш 4.3.30

Предположим, у вас есть следующий код:

#!/bin/bash

declare -A map

f() {
    map[x]=a
    map[y]=b
}

g() {
    for k in "${!map[@]}"
    do
        echo "$k --> ${map[$k]}"
    done
}

f
g

Это выводы

x --> a
y --> b

Если я изменю вышеупомянутую программу на f | g это ничего не выводит.

Я предполагал, что объявление ассоциативного массива в глобальном масштабе позволит мне получить доступ к его значениям в любое время и где угодно. Я читал о странных проблемах с конвейером и областью действия, но я не смог найти решение.

1 ответ1

2

Где вы объявляете переменную, не имеет значения. f выполняется в отдельном процессе, потому что он находится в конвейере, поэтому любые изменения, которые f вносит в map , изолированы от этого процесса. Исправить в этом случае легко; f не производит никакого вывода, поэтому нет никакой причины использовать канал для подключения его к g . Просто запустите f , затем g .

f; g

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .