Bash shell, mảng kết hợp trống sau khi đường ống


0

Bash 4.3.30

Giả sử bạn có đoạn mã sau:

#!/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

Đầu ra này

x --> a
y --> b

Nếu tôi thay đổi chương trình đã đề cập ở trên thành f | g nó không có kết quả.

Tôi cho rằng việc khai báo mảng kết hợp trong phạm vi toàn cầu sẽ cho phép tôi truy cập các giá trị của nó bất cứ lúc nào và bất cứ nơi nào tôi muốn. Tôi đã đọc về các vấn đề lạ với đường ống và phạm vi nhưng tôi không thể tìm ra giải pháp.

Câu trả lời:


2

Trường hợp bạn khai báo biến không quan trọng. f chạy trong một quy trình riêng biệt vì nó nằm trong một đường ống, do đó, bất kỳ thay đổi nào f làm cho map bị cô lập để cái đó quá trình. Việc khắc phục trong trường hợp này là dễ dàng; f không tạo ra bất kỳ đầu ra nào, vì vậy không có lý do gì để sử dụng đường ống để kết nối nó với g. Đơn giản chỉ cần chạy f, sau đó g.

f; g

Nếu tôi phải sử dụng thì sao? cat file.txt | f; g bởi vì f cần một số đầu vào? g trong trường hợp đó đầu ra không có gì.
Banex

1
Vâng, cho một, sử dụng f < file.txt không phải cat, nhưng nói chung, bạn có thể sử dụng lastpipe tùy chọn sao cho Cuối cùng lệnh trong một đường ống thực thi trong quy trình hiện tại ( shopt -s lastpipe; somecommand | f; g ) hoặc sử dụng thay thế quá trình thay vì đường ống ( f < <(somecommand); g ).
chepner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.