Với bash 4.1.2 và 4.3.48, kịch bản sau đây cung cấp cho các đầu ra mong đợi:"printf -v" bên trong chức năng không làm việc với sản lượng chuyển hướng
#!/bin/bash
returnSimple() {
local __resultvar=$1
printf -v "$__resultvar" '%s' "ERROR"
echo "Hello World"
}
returnSimple theResult
echo ${theResult}
echo Done.
Output như mong đợi:
$ ./returnSimple
Hello World
ERROR
Done.
Tuy nhiên, khi stdout từ chức năng được chuyển đến một quy trình khác, việc gán biến số __resultvar
không hoạt động nữa:
#!/bin/bash
returnSimple() {
local __resultvar=$1
printf -v "$__resultvar" '%s' "ERROR"
echo "Hello World"
}
returnSimple theResult | cat
echo ${theResult}
echo Done.
Output mong đợi:
$ ./returnSimple
Hello World
Done.
Tại sao printf -v
không làm việc trong trường hợp thứ hai? Nếu printf -v
không ghi giá trị vào biến kết quả độc lập liệu đầu ra của hàm có được dẫn tới một quá trình khác không?
Đường ống khác với chuyển hướng IO. – chepner
@chepner Đúng, và đó cũng là lý do tại sao tôi quan sát thấy trường hợp sử dụng này hoạt động với chuyển hướng, nhưng không phải với đường ống ... đã cố định chi tiết đó trong câu hỏi –